코딩 테스트/백준

[Python] 백준 1697 숨바꼭질

위시리 2025. 3. 24. 10:28

 

문제 분석

  • 시작 위치 : N, 도착 위치 : K
  • X에서
    • 걷는 다면 : X-1, X+1
    • 순간이동 : X*2

 

풀이

  • 각 이동하는 칸에 대하여 최단 거리 구하기
  • 각 칸에 대한 이동 시간 기록
  • dp
  • dfs ?

 

코드 설계

 

 

정답 코드

1차 - 메모리초과

import sys
input = sys.stdin.readline
from collections import deque

n, k = map(int, input().split())

def dfs() :
    d = deque()
    d.append((n, 0))

    while d :
        x, cnt = d.popleft()

        if x == k:
            print(cnt)
            break

        d.append((x + 1, cnt + 1))
        d.append((x - 1, cnt + 1))
        d.append((x * 2, cnt + 1))

dfs()

 

2차 - 런타임에러

갔던 곳에 대해서 또 확인하지 않도록 visited 배열 선언

import sys
input = sys.stdin.readline
from collections import deque

n, k = map(int, input().split())

v = [False for _ in range(100001)]

def dfs() :
    d = deque()
    d.append((n, 0))
    v[n] = True

    while d :
        x, cnt = d.popleft()

        if x == k:
            print(cnt)
            break

        if not v[x+1] :
            d.append((x + 1, cnt + 1))
            v[x+1] = True

        if not v[x-1] :
            d.append((x - 1, cnt + 1))
            v[x - 1] = True

        if not v[x*2] :
            d.append((x * 2, cnt + 1))
            v[x * 2] = True

dfs()

 

3차 - 통과

범위 체크 추가

import sys
input = sys.stdin.readline
from collections import deque

n, k = map(int, input().split())

v = [False for _ in range(100001)]

def dfs() :
    d = deque()
    d.append((n, 0))
    v[n] = True

    while d :
        x, cnt = d.popleft()

        if x == k:
            return cnt

        if (0 <= x+1 <= 100000) and not v[x+1] :
            d.append((x + 1, cnt + 1))
            v[x+1] = True

        if (0 <= x-1 <= 100000) and not v[x-1] :
            d.append((x - 1, cnt + 1))
            v[x - 1] = True

        if (0 <= x*2 <= 100000) and not v[x*2] :
            d.append((x * 2, cnt + 1))
            v[x * 2] = True

print(dfs())