https://www.acmicpc.net/problem/16928
주사위를 조작해 내가 원하는 수가 나오게 만들 수 있다면, 최소 몇 번만에 도착점에 도착할 수 있을까?
보드판에는 1부터 100까지 수가 하나씩 순서대로 적혀져 있다.
플레이어는 주사위를 굴려 나온 수만큼 이동해야 한다.
만약 주사위를 굴린 결과가 100번 칸을 넘어간다면 이동할 수 없다.
도착한 칸이 사다리면, 사다리를 타고 위로 올라간다. 뱀이 있는 칸에 도착하면, 뱀을 따라서 내려가게 된다.
게임의 목표는 1번 칸에서 시작해서 100번 칸에 도착하는 것이다.
게임판의 상태가 주어졌을 때, 100번 칸에 도착하기 위해 주사위를 굴려야 하는 횟수의 최솟값을 구하는 프로그램.
(입력 및 선언)
(게임 시작)
(bfs 함수)
from collections import deque
n, m = map(int, input().split())
ladder = {}
snakes = {}
answer = [0 for _ in range(101)]
queue = deque([1])
visited = [0 for _ in range(101)]
# 사다리 정보 저장
for _ in range(n):
x, y = map(int, input().split())
ladder[x] = y
# 뱀 정보 저장
for _ in range(m):
u, v = map(int, input().split())
snakes[u] = v
def bfs():
while queue:
pos = queue.popleft()
if pos == 100:
print(answer[pos])
break
for i in range(6):
nloc = pos + i + 1
if nloc > 100 or nloc < 0:
continue
if nloc in ladder.keys():
nloc = ladder[nloc]
if nloc in snakes.keys():
nloc = snakes[nloc]
if not visited[nloc]:
queue.append(nloc)
visited[nloc] = 1
answer[nloc] = answer[pos] + 1
visited[1] = 1
bfs()
(+ 23/7/14)
answer 리스트 만들지 않고 visited 활용한 코드
from collections import deque
n, m = map(int, input().split())
ladder = {}
snake = {}
visited = [0 for _ in range(101)]
queue = deque()
for _ in range(n):
x, y = map(int, input().split())
ladder[x] = y
for _ in range(m):
u, v = map(int, input().split())
snake[u] = v
def bfs():
while queue:
curNum = queue.popleft()
if curNum >= 100:
return visited[curNum] - 1
for i in range(6):
nNum = curNum + i + 1
if nNum > 100 or nNum < 0:
continue
if nNum in ladder.keys():
nNum = ladder[nNum]
if nNum in snake.keys():
nNum = snake[nNum]
if not visited[nNum]:
queue.append(nNum)
visited[nNum] = visited[curNum] + 1
queue.append(1)
visited[1] = 1
print(bfs())
딕셔너리를 사용한 그래프 문제였다. 문제가 난잡한 것이 아니라서 차근히 여러 개념을 적용하고 복습하기 좋았다.
처음에는 answer을 변수로 설정했는데 최솟값이 출력되지 않아 리스트로 바꾸게 되었다.