Skip to content

Commit bf754a2

Browse files
committed
[BOJ] 장군 / 골드 5 / 70분
https://www.acmicpc.net/problem/16509
1 parent 32698d2 commit bf754a2

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
'''
2+
1. 아이디어
3+
- 상이 왕에게 도달할 수 있는 최소 횟수를 구하기 위해 장기판을 그래프로 놓고 상이 갈 수 있는 위치를 bfs로 탐색한다.
4+
5+
2. 시간복잡도
6+
- BFS 시간복잡도 O(V + E), V는 10 * 9 , E는 최대 4 * 10 * 9.
7+
8+
3. 구현
9+
3.1 입력받기
10+
3.2 상의 초기 위치에서부터 8가지 방향으로 나아가며 bfs 실행.
11+
3.3 이동 경로에 왕이 있으면 이동 불가
12+
3.4 bfs가 끝나기 전에 왕의 위치에 도달하면 이동횟수 출력, 도달하지 못하면 -1 출력
13+
'''
14+
15+
from collections import deque
16+
17+
# 입력 받기
18+
R1, C1 = map(int, input().split()) # 상의 시작 위치
19+
R2, C2 = map(int, input().split()) # 왕의 위치
20+
21+
# 방문 여부를 -1로 초기화 (10행 x 9열)
22+
visited = [[-1] * 9 for _ in range(10)]
23+
visited[R1][C1] = 0 # 시작 위치는 0으로 표시
24+
25+
# 상의 8가지 이동 방향 및 그에 따른 경유 좌표 정의
26+
# 각각: 경유1, 경유2, 최종 목적지 (총 3단계 이동)
27+
paths = [
28+
[(-1, 0), (-2, -1), (-3, -2)],
29+
[(-1, 0), (-2, 1), (-3, 2)],
30+
[(1, 0), (2, -1), (3, -2)],
31+
[(1, 0), (2, 1), (3, 2)],
32+
[(0, -1), (-1, -2), (-2, -3)],
33+
[(0, -1), (1, -2), (2, -3)],
34+
[(0, 1), (-1, 2), (-2, 3)],
35+
[(0, 1), (1, 2), (2, 3)],
36+
]
37+
38+
# 이동 경로에 왕이 있는지 확인
39+
def check(x, y, i):
40+
for dx, dy in paths[i][:2]: # 경유지 두 곳만 확인
41+
mx, my = x + dx, y + dy
42+
if mx == R2 and my == C2:
43+
return False
44+
return True
45+
46+
# BFS로 최소 이동 횟수 찾기
47+
def bfs():
48+
queue = deque([(R1, C1)])
49+
50+
while queue:
51+
x, y = queue.popleft()
52+
53+
# 왕의 위치에 도달한 경우
54+
if x == R2 and y == C2:
55+
print(visited[x][y])
56+
return
57+
58+
for i in range(8):
59+
nx = x + paths[i][2][0]
60+
ny = y + paths[i][2][1]
61+
62+
# 범위 안이고, 방문하지 않았으며, 경로에 왕이 없다면
63+
if 0 <= nx < 10 and 0 <= ny < 9 and visited[nx][ny] == -1 and check(x, y, i):
64+
visited[nx][ny] = visited[x][y] + 1
65+
queue.append((nx, ny))
66+
67+
# 도달할 수 없는 경우
68+
print(-1)
69+
70+
bfs()

0 commit comments

Comments
 (0)