BFS - 16928번: 뱀과 사다리 게임

jisu_log·2025년 7월 9일

알고리즘 문제풀이

목록 보기
59/105


업로드중..

  • 모든 간선 가중치가 1 or 동일한 경우 -> BFS
  • 양의 가중치 -> 다익스트라
  • 가중치가 0 or 1 -> 0-1 BFS(deque 앞, 뒤로 삽입)
from collections import deque, defaultdict

n, m = map(int, input().split())
ladders = defaultdict(int)
snakes = defaultdict(int)

for i in range(n):
    line = list(map(int, input().split()))
    ladders[line[0]] = line[1]

for i in range(m):
    line = list(map(int, input().split()))
    snakes[line[0]] = line[1]


# 1 to 100

def bfs(snakes, ladders):
    q = deque()
    q.append((1, 0))
    visited = set()
    visited.add(1)
    answer = -1

    while q:
        now, turn = q.popleft()

        if now == 100: # 100에 도착 시 종료
            answer = turn
            break

        for i in range(1, 7): # 주사위 1~6
            next = now + i
            
            if next <= 100 and next not in visited: # 다음 칸이 맵 내부이면서 방문 안한 칸이라면
                if next in ladders: # 사다리가 있는 칸이면 해당 칸으로 이동
                    q.append((ladders[next], turn + 1))
                    visited.add(ladders[next])
                elif next in snakes: # 뱀이 있는 칸이면 해당 칸으로 이동
                    q.append((snakes[next], turn + 1))
                    visited.add(snakes[next])
                else: # 아무것도 없으면 다음 칸으로 이동
                    q.append((next, turn + 1))
                    visited.add(next)
    
    return answer

print(bfs(snakes, ladders))
    

0개의 댓글