Baekjoon/DFS와 BFS

[백준] 1697 숨바꼭질 (실버1) / BFS

hellosonic 2023. 4. 21. 15:19

문제요약

나의 코드 및 설명

  • 문제의 조건 범위(0이상 100000이하)에 해당하는 룩업테이블 visited 리스트를 만들고, 방문 할 때마다 visited 리스트에 저장된 값을 1씩 증가시킨다. 
  • 만약 동생을 만나게 된다면, 현재까지의 visited 리스트에 저장된 값에서 1을 빼준 값을 리턴한다.
from collections import deque

def bfs(sx, ex):
    global count
    queue = deque()
    queue.append(sx)
    #수빈이 위치 방문처리 
    visited[sx] = 1

    while queue:
        x = queue.popleft()
        if x == ex: #수빈이가 동생과 만난다면 
            return visited[x] - 1 #룩업테이블에 저장된 값-1 리턴
        for i in (x-1, x+1, 2*x): #수빈이가 갈 수 있는 위치
            #문제의 조건 범위를 벗어나지 않고, 방문하지 않은 곳이라면
            if 0<=i<=100000 and visited[i] == 0:
                #우선 방문처리
                visited[i] = visited[x] + 1
                #큐에 다음 좌표 삽입
                queue.append(i)
                
n, k = map(int, input().split())
visited = [0] * 100001 #룩업테이블(문제의 조건 범위)
count = 0

print(bfs(n,k))

피드백

이전까지는 이차원 리스트에서 최단 거리를 찾는 데에 BFS를 활용했었는데, 이번엔 일직선에서 최단거리를 찾는 문제라 처음 풀 때는 되게 어려웠던 것 같다. 특히, 수빈이가 움직일 수 있는 좌표가 x-1, x+1, 2*x 셋 중 하나인데, 이를 어떻게 표현해야 할지도 막막했던 문제. 

다른 사람의 풀이를 참고하고 '아, 이거구나' 싶었다. for i in (x-1, x+1, 2*x) 로 간단하게 표현할 수 있었던 것이다.

또한 문제의 조건 범위를 직접적으로 코드에 활용한 문제가 많지 않았는데, 이번 기회로 문제의 조건 범위를 코드에 활용하는 데에 조금 더 익숙해줄 수 있었던, 배울 점이 많았던 문제였다.