백준 :: 숨바꼭질 <1697번>

혜 콩·2022년 7월 29일
0

알고리즘

목록 보기
44/61

> 문제 <

https://www.acmicpc.net/problem/1697

> 풀이 <

5(N)에서 갈 수 있는 방법은 3가지 (N-1, N+1, N*2)
MAX 만큼 0으로 초기화된 dist 리스트를 생성해주고 ,
3가지 방법 중 하나를 이용한 이동 위치(nx)가 0~MAX 사이 and dist[nx] = 0이면
dist[nx] = 현재 위치(x)의 dist 값 + 1을 해준다.

Why dist[nx] = 0 조건이 필요한가?
이미 그 위치로 이동했었다면, queue에 이미 해당 위치가 append가 되었을 것이다.
이 조건이 없었다면 nx 위치 중복이 되어 최소 시간이 아니라 시간이 중복으로 + 됐을 것.
최소 시간을 카운트하기 위해! = 모든 위치는 1번만 queue에 들어가면 된다. ( 각각의 위치는 모두 독립적이다. 연속성이 없음 )

> 코드 <

from collections import deque

n, k = map(int, input().split())
MAX = 10**5
dist = [0] * (MAX + 1)            # indexError 방지 -> MAX만큼 list 생성


def bfs(x):
    queue = deque()
    queue.append(x)
    while queue:
        x = queue.popleft()
        if x == k:
            print(dist[x])
            break
        for nx in (x-1, x+1, x*2):
            if 0 <= nx <= MAX and not dist[nx]:                 # k보다 초과한 수에서 x-1 방법이 최소 시간이 걸리는 정답일 수도 있으니까 조건을 nx <= MAX로 설정
                dist[nx] = dist[x] + 1
                queue.append(nx)

bfs(n)
profile
배우고 싶은게 많은 개발자📚

0개의 댓글