Skip to content

Commit 278d6ed

Browse files
committed
[level 3] Title: 아이템 줍기, Time: 0.78 ms, Memory: 94.3 MB -BaekjoonHub
1 parent ce6bf7c commit 278d6ed

File tree

2 files changed

+242
-0
lines changed

2 files changed

+242
-0
lines changed
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
# [level 3] 아이템 줍기 - 87694
2+
3+
[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/87694)
4+
5+
### 성능 요약
6+
7+
메모리: 94.3 MB, 시간: 0.78 ms
8+
9+
### 구분
10+
11+
코딩테스트 연습 > 깊이/너비 우선 탐색(DFS/BFS)
12+
13+
### 채점결과
14+
15+
정확성: 100.0<br/>합계: 100.0 / 100.0
16+
17+
### 제출 일자
18+
19+
2025년 09월 18일 16:11:10
20+
21+
### 문제 설명
22+
23+
<p>다음과 같은 다각형 모양 지형에서 캐릭터가 아이템을 줍기 위해 이동하려 합니다.</p>
24+
25+
<p><img src="https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/9b96b07f-72db-4b1c-bd7a-6a9c9b8d0dc6/rect_1.png" title="" alt="rect_1.png"></p>
26+
27+
<p>지형은 각 변이 x축, y축과 평행한 직사각형이 겹쳐진 형태로 표현하며, 캐릭터는 이 다각형의 둘레(굵은 선)를 따라서 이동합니다. </p>
28+
29+
<p>만약 직사각형을 겹친 후 다음과 같이 중앙에 빈 공간이 생기는 경우, 다각형의 가장 바깥쪽 테두리가 캐릭터의 이동 경로가 됩니다.</p>
30+
31+
<p><img src="https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/38b0739b-8dd8-40d8-ac44-c71678d28d07/rect_2.png" title="" alt="rect_2.png"></p>
32+
33+
<p>단, 서로 다른 두 직사각형의 x축 좌표 또는 y축 좌표가 같은 경우는 없습니다.</p>
34+
35+
<p><img src="https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/ec976181-987e-494e-bb2d-0615ce16252f/rect_4.png" title="" alt="rect_4.png"></p>
36+
37+
<p>즉, 위 그림처럼 서로 다른 두 직사각형이 꼭짓점에서 만나거나, 변이 겹치는 경우 등은 없습니다.</p>
38+
39+
<p>다음 그림과 같이 지형이 2개 이상으로 분리된 경우도 없습니다.</p>
40+
41+
<p><img src="https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/7eda8d92-ebe0-4b5f-bd15-0c9dc7af3a3e/rect_3.png" title="" alt="rect_3.png"></p>
42+
43+
<p>한 직사각형이 다른 직사각형 안에 완전히 포함되는 경우 또한 없습니다.</p>
44+
45+
<p><img src="https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/1e178b0d-6580-4981-aae3-dd82a1b95362/rect_7.png" title="" alt="rect_7.png"></p>
46+
47+
<p>지형을 나타내는 직사각형이 담긴 2차원 배열 rectangle, 초기 캐릭터의 위치 characterX, characterY, 아이템의 위치 itemX, itemY가 solution 함수의 매개변수로 주어질 때, 캐릭터가 아이템을 줍기 위해 이동해야 하는 가장 짧은 거리를 return 하도록 solution 함수를 완성해주세요.</p>
48+
49+
<h5>제한사항</h5>
50+
51+
<ul>
52+
<li>rectangle의 세로(행) 길이는 1 이상 4 이하입니다.</li>
53+
<li>rectangle의 원소는 각 직사각형의 [좌측 하단 x, 좌측 하단 y, 우측 상단 x, 우측 상단 y] 좌표 형태입니다.
54+
55+
<ul>
56+
<li>직사각형을 나타내는 모든 좌표값은 1 이상 50 이하인 자연수입니다.</li>
57+
<li>서로 다른 두 직사각형의 x축 좌표, 혹은 y축 좌표가 같은 경우는 없습니다.</li>
58+
<li>문제에 주어진 조건에 맞는 직사각형만 입력으로 주어집니다.</li>
59+
</ul></li>
60+
<li>charcterX, charcterY는 1 이상 50 이하인 자연수입니다.
61+
62+
<ul>
63+
<li>지형을 나타내는 다각형 테두리 위의 한 점이 주어집니다.</li>
64+
</ul></li>
65+
<li>itemX, itemY는 1 이상 50 이하인 자연수입니다.
66+
67+
<ul>
68+
<li>지형을 나타내는 다각형 테두리 위의 한 점이 주어집니다.</li>
69+
</ul></li>
70+
<li>캐릭터와 아이템의 처음 위치가 같은 경우는 없습니다.</li>
71+
</ul>
72+
73+
<hr>
74+
75+
<ul>
76+
<li>전체 배점의 50%는 직사각형이 1개인 경우입니다.<br></li>
77+
<li>전체 배점의 25%는 직사각형이 2개인 경우입니다.<br></li>
78+
<li>전체 배점의 25%는 직사각형이 3개 또는 4개인 경우입니다.<br></li>
79+
</ul>
80+
81+
<hr>
82+
83+
<h5>입출력 예</h5>
84+
<table class="table">
85+
<thead><tr>
86+
<th>rectangle</th>
87+
<th>characterX</th>
88+
<th>characterY</th>
89+
<th>itemX</th>
90+
<th>itemY</th>
91+
<th>result</th>
92+
</tr>
93+
</thead>
94+
<tbody><tr>
95+
<td>[[1,1,7,4],[3,2,5,5],[4,3,6,9],[2,6,8,8]]</td>
96+
<td>1</td>
97+
<td>3</td>
98+
<td>7</td>
99+
<td>8</td>
100+
<td>17</td>
101+
</tr>
102+
<tr>
103+
<td>[[1,1,8,4],[2,2,4,9],[3,6,9,8],[6,3,7,7]]</td>
104+
<td>9</td>
105+
<td>7</td>
106+
<td>6</td>
107+
<td>1</td>
108+
<td>11</td>
109+
</tr>
110+
<tr>
111+
<td>[[1,1,5,7]]</td>
112+
<td>1</td>
113+
<td>1</td>
114+
<td>4</td>
115+
<td>7</td>
116+
<td>9</td>
117+
</tr>
118+
<tr>
119+
<td>[[2,1,7,5],[6,4,10,10]]</td>
120+
<td>3</td>
121+
<td>1</td>
122+
<td>7</td>
123+
<td>10</td>
124+
<td>15</td>
125+
</tr>
126+
<tr>
127+
<td>[[2,2,5,5],[1,3,6,4],[3,1,4,6]]</td>
128+
<td>1</td>
129+
<td>4</td>
130+
<td>6</td>
131+
<td>3</td>
132+
<td>10</td>
133+
</tr>
134+
</tbody>
135+
</table>
136+
<h5>입출력 예 설명</h5>
137+
138+
<p>입출력 예 #1</p>
139+
140+
<p><img src="https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/7b89552b-f7b6-47e7-8bbd-deaf01907f70/rect_5.png" title="" alt="rect_5.png"></p>
141+
142+
<p>캐릭터 위치는 (1, 3)이며, 아이템 위치는 (7, 8)입니다. 위 그림과 같이 굵은 선을 따라 이동하는 경로가 가장 짧습니다.</p>
143+
144+
<p>입출력 예 #2</p>
145+
146+
<p><img src="https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/ac6911d0-e386-472b-a109-2542214c8d6b/rect_6.png" title="" alt="rect_6.png"></p>
147+
148+
<p>캐릭터 위치는 (9, 7)이며, 아이템 위치는 (6, 1)입니다. 위 그림과 같이 굵은 선을 따라 이동하는 경로가 가장 짧습니다.</p>
149+
150+
<p>입출력 예 #3</p>
151+
152+
<p><img src="https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/9c47ca5c-df4b-4b2e-8c5b-faf0815de665/rect_8.png" title="" alt="rect_8.png"></p>
153+
154+
<p>캐릭터 위치는 (1, 1)이며, 아이템 위치는 (4, 7)입니다. 위 그림과 같이 굵은 선을 따라 이동하는 경로가 가장 짧습니다.</p>
155+
156+
<p>입출력 예 #4, #5</p>
157+
158+
<p>설명 생략</p>
159+
160+
161+
> 출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import java.util.*;
2+
3+
class Solution {
4+
int[][] map = new int[101][101];
5+
boolean[][] visited = new boolean[101][101];
6+
7+
int[] dx = {-1,1,0,0};
8+
int[] dy = {0,0,-1,1};
9+
10+
public int solution(int[][] rectangle, int characterX, int characterY, int itemX, int itemY) {
11+
12+
drawRectangle(rectangle);
13+
14+
int distance = bfs(characterX * 2, characterY * 2, itemX * 2, itemY * 2);
15+
16+
return distance/2;
17+
}
18+
19+
void drawRectangle(int[][] rectangle){
20+
21+
for(int[] r : rectangle) {
22+
int startX = r[0] * 2;
23+
int startY= r[1] * 2;
24+
int endX = r[2] * 2;
25+
int endY = r[3] * 2;
26+
27+
// 사각형 채우기
28+
for(int x = startX; x <= endX; x ++) {
29+
for(int y = startY; y <= endY; y++) {
30+
map[x][y] = 1;
31+
}
32+
}
33+
}
34+
35+
for(int[] r : rectangle) {
36+
int startX = r[0] * 2;
37+
int startY= r[1] * 2;
38+
int endX = r[2] * 2;
39+
int endY = r[3] * 2;
40+
41+
// 테두리 빼고 파내기
42+
for(int x = startX+1; x < endX; x ++) {
43+
for(int y = startY+1; y < endY; y++) {
44+
map[x][y] = 0;
45+
}
46+
}
47+
}
48+
}
49+
50+
int bfs(int characterX, int characterY, int itemX, int itemY) {
51+
Queue<int[]> queue = new LinkedList<>();
52+
queue.offer(new int[]{characterX, characterY,0});
53+
visited[characterX][characterY] = true;
54+
55+
while(!queue.isEmpty()) {
56+
int[] current = queue.poll();
57+
int currentX = current[0];
58+
int currentY = current[1];
59+
int currentDistance = current[2];
60+
61+
if(currentX == itemX && currentY == itemY) return currentDistance;
62+
63+
int nextX;
64+
int nextY;
65+
66+
for(int i = 0; i < 4; i ++){
67+
nextX = currentX + dx[i];
68+
nextY = currentY + dy[i];
69+
70+
// 범위 내에 있고, 테두리를 따라가고, 방문한적 x
71+
if(nextX >= 0 && nextX < 101 && nextY >=0 && nextY < 101 && map[nextX][nextY] == 1 && !visited[nextX][nextY]){
72+
73+
visited[nextX][nextY] = true;
74+
queue.offer(new int[]{nextX,nextY,currentDistance+1});
75+
}
76+
}
77+
}
78+
79+
return -1;
80+
}
81+
}

0 commit comments

Comments
 (0)