알고리즘/백준

1697번: 숨바꼭질

happenundo 2024. 1. 29. 20:00
728x90
 

1697번: 숨바꼭질

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일

www.acmicpc.net


최단 경로 -> BFS

BFS를 사용해서 풀면 되는 문제다.

 


풀이 코드

# 1697번: 숨바꼭질
from collections import deque

n,k = map(int, input().split())
visited = [0] * 100002 # 방문 여부 + 해당 인덱스에 방문하기 까지 걸린 시간을 저장하기 위한 리스트

def bfs(n, k):
    if n == k: # 동생과 위치가 같다면 그대로 0 리턴
        return 0
    queue = deque([n]) # 시작점을 큐에 넣는다.
    
    while queue:
        now = queue.popleft()
        
        if now + 1 < 100001 and visited[now + 1] == 0:
            queue.append(now + 1)
            visited[now+1] = visited[now] + 1
        if now > 0 and now * 2 < 100001 and visited[now * 2] == 0:
            queue.append(now * 2)
            visited[now * 2] = visited[now] + 1  
 
        if now - 1 >= 0 and visited[now - 1] == 0:
            queue.append(now - 1)
            visited[now-1] = visited[now] + 1

        # k가 0이 아니라면 해당 시간이 가장 빠른 시간
        if visited[k] != 0:
            return visited[k]



print(bfs(n, k))

 

문제 조건에서 점 0에도 방문할 수 있다고 했는데, 이걸 빼먹어서 해결에 오래 걸렸다.

문제를 자세하게 읽는 습관을 들여야겠다.

 

 

개선된 코드

# 1697번: 숨바꼭질
from collections import deque

n,k = map(int, input().split())
visited = [0] * 100001 # 방문 여부 + 해당 인덱스에 방문하기 까지 걸린 시간을 저장하기 위한 리스트

def bfs(n, k):
    if n == k: # 동생과 위치가 같다면 그대로 0 리턴
        return 0
    queue = deque([n]) # 시작점을 큐에 넣는다.
    
    while queue:
        now = queue.popleft()
        
        for next in ([now - 1, now + 1, now * 2]):
            if next >= 0 and next <= 100000 and visited[next] == 0:
                visited[next] = visited[now] + 1
                queue.append(next)

        # k가 0이 아니라면 해당 시간이 가장 빠른 시간
        if visited[k] != 0:
            return visited[k]



print(bfs(n, k))
728x90