728x90
반응형

숨바꼭질 시리즈 3번째 문제다

 

정답 코드 먼저 살펴보자

from collections import deque
n, k = map(int, input().split())

location = [-1] * 100001
time = 0
queue = deque()
queue.append([n, time])
location[n] = 0

while queue :
  curr_n, curr_time = queue.popleft()

  next_n = curr_n * 2
  if 0 <= next_n <= 100000 and (location[next_n] == -1 or location[next_n] > curr_time):
    location[next_n] = curr_time
    queue.appendleft([next_n, curr_time])

  next_n = curr_n + 1
  if next_n <= 100000 and location[next_n] == -1 :
    location[next_n] = curr_time + 1
    queue.append([next_n, curr_time + 1])
  
  next_n = curr_n - 1
  if next_n >= 0 and location[next_n] == -1:
    location[next_n] = curr_time + 1
    queue.append([next_n, curr_time + 1])

print(location[k])

 

0초에 순간이동 해주는게 핵심이다. 

bfs로 접근을 하였고 순간이동을 하는 경우는 bfs의 가장 첫번째로 appendleft를 시켜주었다. 

 

순간이동을 할때 조건문을 잘 봐야 하는데

1. 방문한 적이 없거나

2. 방문예정인 곳의 시간 정보가 현재보다 클때이다 예를들면
i) 4 -> 3 -> 6 -> 12

ii) 4 -> 5 -> 6 -> 12 

 

6에 접근을 하는 경우가 i)의 경우 1, ii)의 경우 2이다. 

내 코드에서는 ii)의 경우가 먼저 6에 접근이 되었고 i)의 경우에서 6에 접근할때 기존 6에 업데이트를 해주어야 했다.

>= 조건을 사용할 경우 같은 값일때도 들어가서 불필요한 경우에도 queue에 append가 되어서 while이 종료되지 않은 경우도 있을수 있다. 시간 정보를 업데이트 해줄때만 필요하므로 주의해주자!!

 

 

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

 

13549번: 숨바꼭질 3

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

www.acmicpc.net

 

728x90
반응형

'알고리즘' 카테고리의 다른 글

RGB거리[백준 1149] - python  (0) 2021.12.12
RGB거리2[백준 17404] - python  (0) 2021.12.11
숨바꼭질2[백준 12851] - python  (0) 2021.12.09
최소공배수 [백준 1934] - python  (0) 2021.12.07
최대 힙[백준 11279] - python  (2) 2021.12.05

+ Recent posts