728x90
# Baekjoon 16928번: 뱀과 사다리 게임
import sys
from collections import deque
input = sys.stdin.readline
N, M = map(int, input().split())
visited = [0 for _ in range(101)]
ladder = [tuple(map(int, input().split())) for _ in range(N)]
snake = [tuple(map(int, input().split())) for _ in range(M)]
visited_ladder = [None for _ in range(101)]
visited_snake = [None for _ in range(101)]
for x, y in ladder:
visited_ladder[x] = y
for u, v in snake:
visited_snake[u] = v
res = 0
def BFS(m):
queue = deque([])
queue.append(m)
visited[m] = 1
while queue:
pre = queue.popleft()
if pre == 100: # 도착한 경우
return visited[pre] - 1
for i in range(1, 7):
num = pre + i
if num > 100:
continue
if visited_ladder[num]: # 사다리에 방문한 경우
num = visited_ladder[num]
if visited_snake[num]: # 뱀에 방문한 경우
num = visited_snake[num]
if visited[num] == 0: # 비어있는 경우
visited[num] = visited[pre] + 1
queue.append(num)
result = BFS(1)
print(result)
이 문제는 BFS 알고리즘 문제였다. 사다리와 뱀의 좌표를 저장하고, queue에서 추출한 원소를 기준으로 for문을 사용해 주사위의 범위에 속하는 index를 탐색한다.
해당 index가 100인 경우에는 도착한 지점이므로 return 후 종료한다.
해당 index가 뱀 혹은 사다리인 경우에는 뱀과 사다리 좌표를 저장한 list에서 값을 추출한다.
그렇게 해서 바뀐 index가 비어있는 경우에는 지금이 몇 번째로 주사위를 돌렸는지 visited 리스트에 저장하고, queue에 index를 추가한다.
위의 그림은 사다리가 2 72 / 6 80 / 8 52에 위치할 때의 BFS가 어떻게 작동되는지를 그림으로 나타낸 것이다.
728x90
'BaekJoon' 카테고리의 다른 글
[Baekjoon/Python] 1149번: RGB거리(Dynamic Programming) (0) | 2024.10.24 |
---|---|
[Baekjoon/Python] 10026번: 적록색약(BFS) (0) | 2024.10.23 |
[Baekjoon/Python] 1759번: 암호 만들기(BackTracking) (0) | 2024.10.11 |
[Baekjoon/Python] 15686번: 치킨 배달(BackTracking) (2) | 2024.10.11 |
[Baekjoon/Python] 14940번: 쉬운 최단거리(BFS) (0) | 2024.10.06 |