백준 1697번 숨바꼭질

DARTZ·2022년 5월 5일
0

알고리즘

목록 보기
36/135

내가 푼 틀린코드..

import sys
from collections import deque

sys.stdin = open('input.txt', 'rt')
input = sys.stdin.readline

N, K = map(int, input().split())
visited = [False] * 100001

def bfs():

    while queue:

        num = queue.popleft()

        if 0 <= num <= 100000:

            if num == K:
                break

            n1 = num + 1
            n2 = num - 1
            n3 = num * 2

            if visited[n1] != False:
                visited[n1] = min(visited[num] + 1, visited[n1])

            else:
                visited[n1] = visited[num] + 1

            if visited[n2] != False:
                visited[n2] = min(visited[num] + 1, visited[n2])

            else:
                visited[n2] = visited[num] + 1

            if visited[n3] != False:
                visited[n3] = min(visited[num] + 1, visited[n3])

            else:
                visited[n3] = visited[num] + 1

            queue.append(n1)
            queue.append(n2)
            queue.append(n3)


queue = deque()
queue.append(N)
visited[N] = 0
bfs()

print(visited[K])

세상 원시적으로 풀었다. 몇가지 조건을 추가해주면 될 것 같아서 추가 해주다보니 이미 내 코드가 잘 못 되었다는 것을 직감했다. 역시 index error가 발생했다.
이유는 test case에 음수가 들어갈 경우 visited 배열에 없기 때문이다.

정답코드

import sys
from collections import deque

def bfs(v):
    q = deque([v]) # 큐 구현을 위해 deque 사용
    while q:
        v = q.popleft()
        if v == k: # 도착지점에 도착하면 종료
            return visited[v]
            
        # 참고 블로그 링크에 설명이 잘 되어 있다. 이런 식이 나오는구나..
        for i in (v-1, v+1, 2*v): 
            if 0 <= i <= 100000 and not visited[i]:
                visited[i] = visited[v] + 1
                q.append(i)

n, k = map(int, sys.stdin.readline().split())
visited = [0 for i in range(100001)] # 방문을 체크하기 위해 배열 생성 100000이 아니라 100001인 이유는 100000을 처리해줘야하기 때문에!
print(bfs(n))

문제 푸는 아이디어 참고 블로그
참고 블로그

profile
사람들이 비용을 지불하고 사용할 만큼 가치를 주는 서비스를 만들고 싶습니다.

0개의 댓글