문제
숨바꼭질 3 (https://www.acmicpc.net/problem/13549)
풀이
1. 초기 접근
- 문제조건 해석
- 움직임, 경로에 대한 문제고, 간선의 길이가 1로 정해져있다.
- BFS 문제다.
- 움직임, 경로에 대한 문제고, 간선의 길이가 1로 정해져있다.
- 알고리즘
- 이전 12851. 숨바꼭질 2 문제에서 방법에 약간 변형을 준 것이다.
- 이전 문제에서는, 현재 위치
cur
에서 다음 위치cur-1
,cur+1
,cur*2
를 한번에 처리했다면, 이번엔 경우를 나눠야한다.- 먼저,
visited[cur]
는cur
위치에 올 때 걸리는 최소 시간을 담는다. cur-1
,cur+1
로 이동하는 경우, 현재 위치까지 걸린 시간 + 1 을 해준다.
즉,visited[cur-1]
,visited[cur+1]
=visited[cur] + 1
이다.
이 때, 당연히 이 시간visited[cur] + 1
이 최소시간인지 조건을 붙여야 한다.cur*2
로 이동하는 경우, 현재 위치까지 걸린시간을 그대로 넣어준다.
즉,visited[cur*2]
=visited[cur]
이다.
마찬가지로 최소시간인지 체크해야 한다.
- 먼저,
- 계속해서 다음 이동좌표를 BFS queue 에 넣어주다가, 최종 목표지점
k
에 도달한 경우, 더 이상 넣지않고, 큐에 있는걸 모두 빼낸다. k
에 도달하는데 걸리는 최소시간은visited[k]
에 있으므로 이를 반환한다.
- 코드
import sys
from collections import deque
n, k = list(map(int, sys.stdin.readline().split()))
def bfs(n, k):
if n >= k:
return n-k
q = deque([n])
visited = [float('inf')] * 100001
visited[n] = 0
success = False
while q and not success:
size = len(q)
for _ in range(size):
cur = q.popleft()
# +1, -1의 경우
next_move = [cur-1, cur+1]
for j in next_move:
if j >= 0 and j <= 100000 and visited[cur] + 1 < visited[j]:
visited[j] = visited[cur] + 1
if j == k:
success = True
if not success:
q.append(j)
# *2 의 경우2 6
if cur*2 >= 0 and cur*2 <= 100000 and visited[cur] < visited[cur*2]:
visited[cur*2] = visited[cur]
if j == k:
success = True
if not success:
q.append(cur*2)
return visited[k]
print(bfs(n, k))
'취업과 기본기 튼튼 > 코딩 테스트 노트' 카테고리의 다른 글
[BOJ] 2636. 치즈 (0) | 2019.04.08 |
---|---|
[BOJ] 13913. 숨바꼭질 4 (0) | 2019.04.07 |
[BOJ] 12851. 숨바꼭질 2 (2) | 2019.04.07 |
[BOJ] 7569. 토마토 (0) | 2019.04.07 |
[BOJ ]7576. 토마토 (0) | 2019.04.07 |