Skip to content

Commit 72e4e5c

Browse files
committed
[level 2] Title: 미로 탈출, Time: 6.75 ms, Memory: 91.9 MB -BaekjoonHub
1 parent 9337477 commit 72e4e5c

File tree

2 files changed

+179
-0
lines changed

2 files changed

+179
-0
lines changed
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
# [level 2] 미로 탈출 - 159993
2+
3+
[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/159993)
4+
5+
### 성능 요약
6+
7+
메모리: 91.9 MB, 시간: 6.75 ms
8+
9+
### 구분
10+
11+
코딩테스트 연습 > 연습문제
12+
13+
### 채점결과
14+
15+
정확성: 100.0<br/>합계: 100.0 / 100.0
16+
17+
### 제출 일자
18+
19+
2025년 08월 25일 13:35:57
20+
21+
### 문제 설명
22+
23+
<p>1 x 1 크기의 칸들로 이루어진 직사각형 격자 형태의 미로에서 탈출하려고 합니다. 각 칸은 통로 또는 벽으로 구성되어 있으며, 벽으로 된 칸은 지나갈 수 없고 통로로 된 칸으로만 이동할 수 있습니다. 통로들 중 한 칸에는 미로를 빠져나가는 문이 있는데, 이 문은 레버를 당겨서만 열 수 있습니다. 레버 또한 통로들 중 한 칸에 있습니다. 따라서, 출발 지점에서 먼저 레버가 있는 칸으로 이동하여 레버를 당긴 후 미로를 빠져나가는 문이 있는 칸으로 이동하면 됩니다. 이때 아직 레버를 당기지 않았더라도 출구가 있는 칸을 지나갈 수 있습니다. 미로에서 한 칸을 이동하는데 1초가 걸린다고 할 때, 최대한 빠르게 미로를 빠져나가는데 걸리는 시간을 구하려 합니다.</p>
24+
25+
<p>미로를 나타낸 문자열 배열&nbsp;<code>maps</code>가 매개변수로 주어질 때, 미로를 탈출하는데 필요한 최소 시간을 return 하는 solution 함수를 완성해주세요. 만약, 탈출할 수 없다면 -1을 return 해주세요.</p>
26+
27+
<hr>
28+
29+
<h5>제한사항</h5>
30+
31+
<ul>
32+
<li>5&nbsp;≤ <code>maps</code>의 길이 ≤ 100
33+
34+
<ul>
35+
<li>5 ≤ <code>maps[i]</code>의 길이 ≤ 100</li>
36+
<li><code>maps[i]</code>는 다음 5개의 문자들로만 이루어져 있습니다.
37+
38+
<ul>
39+
<li>S : 시작 지점</li>
40+
<li>E : 출구</li>
41+
<li>L : 레버</li>
42+
<li>O : 통로</li>
43+
<li>X : 벽</li>
44+
</ul></li>
45+
<li>시작 지점과 출구, 레버는 항상 다른 곳에 존재하며 한 개씩만 존재합니다.</li>
46+
<li>출구는 레버가 당겨지지 않아도 지나갈 수 있으며, 모든 통로, 출구, 레버, 시작점은 여러 번 지나갈 수 있습니다.</li>
47+
</ul></li>
48+
</ul>
49+
50+
<hr>
51+
52+
<h5>입출력 예</h5>
53+
<table class="table">
54+
<thead><tr>
55+
<th>maps</th>
56+
<th>result</th>
57+
</tr>
58+
</thead>
59+
<tbody><tr>
60+
<td>["SOOOL","XXXXO","OOOOO","OXXXX","OOOOE"]</td>
61+
<td>16</td>
62+
</tr>
63+
<tr>
64+
<td>["LOOXS","OOOOX","OOOOO","OOOOO","EOOOO"]</td>
65+
<td>-1</td>
66+
</tr>
67+
</tbody>
68+
</table>
69+
<hr>
70+
71+
<h5>입출력 예 설명</h5>
72+
73+
<p>입출력 예 #1</p>
74+
75+
<p>주어진 문자열은 다음과 같은 미로이며</p>
76+
77+
<p><img src="https://user-images.githubusercontent.com/62426665/214443486-cb2b84a4-afc6-4b25-8da2-645a853859f1.png" title="" alt="image1"></p>
78+
79+
<p>다음과 같이 이동하면 가장 빠른 시간에 탈출할 수 있습니다.</p>
80+
81+
<p><img src="https://user-images.githubusercontent.com/62426665/207090680-93289071-da4f-4126-9c31-066c1d4d3802.png" title="" alt="image2"></p>
82+
83+
<p>4번 이동하여 레버를 당기고 출구까지 이동하면 총 16초의 시간이 걸립니다. 따라서 16을 반환합니다.</p>
84+
85+
<p>입출력 예 #2</p>
86+
87+
<p>주어진 문자열은 다음과 같은 미로입니다.</p>
88+
89+
<p><img src="https://user-images.githubusercontent.com/62426665/214443892-1e7734e9-b4c8-49af-ba29-aa5597039617.png" title="" alt="image3"></p>
90+
91+
<p>시작 지점에서 이동할 수 있는 공간이 없어서 탈출할 수 없습니다. 따라서 -1을 반환합니다.</p>
92+
93+
94+
> 출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import java.util.*;
2+
3+
class Solution {
4+
// 상 하 좌 우
5+
int[] dx = {0,0,-1,1};
6+
int[] dy = {-1,1,0,0};
7+
8+
public int solution(String[] maps) {
9+
int[] start = new int[2];
10+
int[] lever = new int[2];
11+
int[] exit = new int[2];
12+
13+
int row = maps.length;
14+
int col = maps[0].length();
15+
16+
for(int i =0; i < row;i ++){
17+
for(int j = 0; j<col;j++){
18+
char c = maps[i].charAt(j);
19+
// 시작 지점
20+
if(c =='S'){
21+
start = new int[]{i,j};
22+
}else if(c == 'E'){
23+
exit = new int[]{i,j};
24+
} else if(c=='L'){
25+
lever = new int[]{i,j};
26+
}
27+
}
28+
}
29+
30+
// start -> lever 거리
31+
int startToLever = bfs(start,lever,maps);
32+
if(startToLever == -1){
33+
return -1;
34+
}
35+
36+
// lever -> exit 거리
37+
int LeverToExit = bfs(lever,exit,maps);
38+
if(LeverToExit == -1){
39+
return -1;
40+
}
41+
42+
return startToLever + LeverToExit;
43+
}
44+
45+
int bfs(int[] start,int end[], String[] maps){
46+
int row = maps.length;
47+
int col = maps[0].length();
48+
// 현재 위치, 시간
49+
Queue<int[]> queue = new LinkedList<>();
50+
boolean[][] visited = new boolean[row][col];
51+
52+
// 초기 위치
53+
queue.add(new int[]{start[0],start[1],0});
54+
visited[start[0]][start[1]] = true;
55+
56+
while(!queue.isEmpty()){
57+
int[] cur = queue.poll();
58+
int curX = cur[0];
59+
int curY = cur[1];
60+
int time = cur[2];
61+
62+
// 도착
63+
if(curX == end[0] && curY == end[1]){
64+
return time;
65+
}
66+
67+
// 모든 방향 체크
68+
for(int i=0;i<4;i++){
69+
int nextX = curX + dx[i];
70+
int nextY = curY + dy[i];
71+
72+
if(nextX >= 0 && nextX < row && nextY >= 0 && nextY < col
73+
&& !visited[nextX][nextY] && maps[nextX].charAt(nextY) != 'X'){
74+
visited[nextX][nextY] = true;
75+
queue.add(new int[]{nextX,nextY,time+1});
76+
}
77+
}
78+
}
79+
80+
return -1;
81+
}
82+
83+
84+
85+
}

0 commit comments

Comments
 (0)