[BOJ] 1697번: 숨바꼭질

728x90

 

 

문제 링크

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

 

 

 

TIL

  • 가장 빠른 >> BFS !!!!!!!!!!!!
    • 최단 시간, 최단 거리를 묻는 문제는 묻지도 따지지도 않고 BFS 사용하기

 

[메모리 초과 - visited set() 사용]

# bfs >> 가장 빠른 시간
from collections import deque

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

queue = deque()
queue.append((n, 0))  # current_location, time
visited = set()
visited.add(n)

while queue:
    current, time = queue.popleft()
    visited.add(current)

    if current == k:
        print(time)
        break
    
    for i in (current+1, current-1, current*2): # walk_forward, walk_backward, teleport
        if i not in visited:
            queue.append((i, time+1))
  • 메모리 초과 원인 예상
    • set() 에 너무 많은 값이 저장됨
    • 만약에 list로 저장하면 max 값이 정해져있기에 충분히 핸들링 가능
  • BFS도 visited check 필수 !!!!!
    • 갔던 곳을 굳이 또 방문하지 않아야 함 > 이래야지 시간 초과도 안남
  • set()이나 dict()를 사용하는 거보단 list가 메모리나 시간 효율이 좋음 !!
    • 특별한 일 아니면 list 사용하기 > 특히 이런 범위가 큰 문제에 대해선 시간 복잡도 생각해야함
    • 만약에 범위가 작다면 set()도 가능
  •  for i in (current+1, current-1, current*2): 이런 형태의 코드도 생각하기 

 

 

Code

# bfs >> 가장 빠른 시간
from collections import deque

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

queue = deque()
queue.append((n, 0))  # current_location, time
visited = [False for _ in range(100002)]
visited[n]=True

while queue:
    current, time = queue.popleft()
    visited[current] = True

    if current == k:
        print(time)
        break
    
    for i in (current+1, current-1, current*2): # walk_forward, walk_backward, teleport
        if 0<=i<100001 and not visited[i]:
            queue.append((i, time+1))

 

  • index 범위 조심 !! 
    • 문제에서 0부터 100000까지 이동가능하니 100002까지 만들어야하며, 범위 체크도 100000가 포함되어야 한다

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 1926번: 그림 (DFS)  (0) 2025.03.18
[BOJ] 4485번: 녹색 옷 입은 애가 젤다지?  (0) 2025.03.13
[BOJ] 16234번: 인구 이동  (0) 2025.03.13
[BOJ] 13549번: 숨바꼭질 3  (0) 2025.03.12
[BOJ] 1987번: 알파벳  (0) 2025.03.12