Skip to content

Commit b585034

Browse files
committed
2026년 03월 27일 11:16:27
1 parent 99c975b commit b585034

File tree

2 files changed

+94
-0
lines changed

2 files changed

+94
-0
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# [4013] 미로 탈출
2+
### 채점 결과
3+
Accepted
4+
### 제출 일자
5+
2026년 03월 27일 11:16:27
6+
### 성능 요약[추후 구현 예정]
7+
- 메모리: N/A KB
8+
- 시간: N/A ms
9+
---
10+
### 문제 링크
11+
https://code.pusan.ac.kr/problem/4013
12+
### 난이도
13+
어려움
14+
### 문제 설명
15+
미로는 출발점에서 시작해복잡한 여러 길 중 맞는 경로를 찾아도착점까지 도달해야 성공하는 퍼즐이다.한 변 길이가인정사각형 형태의 미로가 있다. 이 미로는 2차원 평면으로 보여지며, 시작점, 도착점, 지나갈 수 있는 길, 벽과 함께 특수한 타일로 구성되어 있다. 이 특수한 타일은 미로를 탈출하는 동안 최대번 밟고 지나갈 수 있으며, 밟는 횟수를번 초과할 수 없다.예시를 통해 살펴보자.한 변의 길이가 5인 정사각형 형태의 미로가 있다.S는 시작점,E는 도착점이다.X는 지나갈 수 없는 벽이며,.는 지나갈 수 있는 길이고,O는 특수한 타일이다. 이 미로에서 특수한 타일을 최대 3번 밟을 수 있다면 아래와 같이 최소 12번의 이동 횟수로 미로를 탈출 할 수 있다.하지만 만약 특수한 타일을 최대 2번 까지만 밟을 수 있다면 아래와 같이 최소 14번의 이동으로 도착점에 도달 할 수 있다.이렇게 미로의 구성 정보와 특수한 타일을 밟을 수 있는 최대 제한 수가 주어질 때, 미로를 빠져나갈 수 있는 최소 이동 횟수를 구하여라. 만약 미로를 탈출할 수 없다면 -1을 출력한다.
16+
### 입력
17+
첫 줄에 정사각형 미로의 길이를 의미하는 자연수 N(3 <= N <= 7)과 특수한 타일을 밟을 수 있는 최대 횟수를 의미하는 자연수 K(1 <= K <= 10)가 공백으로 구분지어주어진다.두 번째 줄부터줄간 길이가인 문자열이 주어진다. 문자열은X,S,E,O,.5개 문자로만 구성된다. 모든 입력에S와E는 하나만 주어진다.
18+
### 출력
19+
미로를 탈출할 수 있는 최소 이동 횟수를 구한다. 만약 탈출할 수 없다면 -1을 출력한다.
20+
### 예제 입력/출력
21+
**예제 입력 1**
22+
```
23+
5 3
24+
S.X.E
25+
X.X.X
26+
X.X..
27+
XOXO.
28+
XO...
29+
```
30+
**예제 출력 1**
31+
```
32+
12
33+
```
34+
**예제 입력 2**
35+
```
36+
5 2
37+
S.X.E
38+
X.X.X
39+
X.X..
40+
XOXO.
41+
XO...
42+
```
43+
**예제 출력 2**
44+
```
45+
14
46+
```
47+
### 제약 사항
48+
- 시간 제한 1000ms
49+
- 메모리 제한 256mb
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
from collections import deque
2+
3+
N, K = map(int, input().split())
4+
maps = []
5+
S = [0, 0]
6+
for i in range(N):
7+
A = list(input())
8+
maps.append(A)
9+
if "S" in A:
10+
S = [i, A.index("S")]
11+
if "E" in A:
12+
E = [i, A.index('E')]
13+
14+
visited = [[[False] * (K + 1) for _ in range(N)] for _ in range(N)]
15+
16+
dx = [1, -1, 0, 0]
17+
dy = [0, 0, 1, -1]
18+
19+
q = deque([(S[0], S[1], 0, 0)])
20+
visited[S[0]][S[1]][0] = True
21+
22+
found = False
23+
while q:
24+
x, y, dist, k_count = q.popleft()
25+
26+
if maps[x][y] == 'E':
27+
print(dist)
28+
found = True
29+
break
30+
31+
for i in range(4):
32+
nx, ny = x + dx[i], y + dy[i]
33+
34+
if 0 <= nx < N and 0 <= ny < N and maps[nx][ny] != 'X':
35+
nk_count = k_count
36+
37+
if maps[nx][ny] == 'O':
38+
nk_count += 1
39+
40+
if nk_count <= K and not visited[nx][ny][nk_count]:
41+
visited[nx][ny][nk_count] = True
42+
q.append((nx, ny, dist + 1, nk_count))
43+
44+
if not found:
45+
print(-1)

0 commit comments

Comments
 (0)