[백준 BOJ_1326] 폴짝폴짝 Python 풀이

출처: 백준 온라인 저지

문제

image

풀이

BFS를 이용해 풀어주었습니다.

queue에 시작점(src)를 넣어주며 이미 방문했던 step은 방문하지 않게끔 visited도 같이 넣어주었습니다. dist는 dist가 가질 수 있는 최대 거리인 N+1으로 초기화해주었고 dist를 업데이트해주며 jump가 dist보다 클 경우에는 더이상 찾지 않게 했습니다.

해당 step이 1의 배수만큼 움직일 수 있다면 더이상 찾지 않게끔 바로 dist를 업데이트 해주었습니다.

각각 양의 배수와 음의 배수쪽 둘다 확인해주기 위해 for loop을 다른 방향으로 두번 써주어 queue에 넣어주었습니다.

코드

from collections import deque

N = int(input())
steps = list(map(int, input().split()))
src, dest = map(int, input().split())
visited = [0 for _ in range(N)]
queue = deque([[src, 0, visited]])
dist = N+1

while queue:
    step, jumps, visited = queue.popleft()
    visited[step-1] = 1
    if steps[step-1] == 1:
       dist = min(jumps+1, dist)
    if step != dest and jumps < dist:
        for i in range(step, N+1, steps[step-1]):
            if not visited[i-1]:
                queue.append((i, jumps+1, visited))
        for j in range(step, 0, -steps[step-1]):
            if not visited[j-1]:
                queue.append((j, jumps+1, visited))
    else:
        dist = min(jumps, dist)

if dist == N+1: print(-1)
else: print(dist)

Leave a comment