백준
[백준 12851번][Python] - 숨바꼭질 2
dietken1
2024. 11. 3. 15:33
반응형
https://www.acmicpc.net/problem/12851
# 풀이과정 (BFS 이용)
- 수빈이가 이동하는 방법은 앞으로 한칸, 뒤로 한칸, 현재 칸의 두배 위치로 점프, 이렇게 3가지이다.
- 각 위치에 도달하기 위한 최소 시간을 나타내는 리스트를 하나 설정
- 최단 시간을 구해야 하기에, 현재까지의 최소시간을 의미하는 전역변수 maxCnt를 설정함
- 최단 기록의 경우의 수를 나타내는 변수 num을 설정함
- BFS를 이용하여 큐에 수빈이가 동생을 잡기위해서 현재까지 소요된 시간 및 현재위치를 넣음
- 이것을 반복하여 동생의 위치에 도달하게 되면, 그때를 기준으로 소요된 시간이 총 걸린 시간임
- maxCnt보다 현재 소요된 시간이 크다면, 해당 경우의수는 더이상 계산하지 않음
- 각 위치별로 도달에 필요한 최소 시간을 나타내는 리스트를 하나 설정
- 만약 큐에서 뽑은 위치와 시간이 리스트에 기록된 시간보다 크다면 해당 경우의수는 더이상 계산하지 않음
- 이를 반복하며, maxCnt가 업데이트되면 num을 1로 초기화
- 만약 걸린 시간이 maxCnt와 같다면 num값을 1증가시킴
- 큐에 더이상 데이터가 없으면 결과를 출력하고 끝냄
# 기존에 위치별 소요시간을 나타내는 리스트의 크기를 동생이 있을 수 있는 최대 위치인 100000으로 잡았더니 틀렸다.
이는 수빈이가 100000을 넘는 위치까지 갔다가 돌아오는 경우의 수가 있기 때문이므로, 위치별 소요시간을 나타내는 리스트의 크기를 크게 300000으로 잡았다.
[BFS를 이용한 코드 - 성공]
# ex_12851
import sys
from collections import deque
N,K = map(int,sys.stdin.readline().split())
timeTable = [1e9 for _ in range(300001)]
maxCnt = 1e9
num = 0
q = deque([])
q.append((N,0))
def bfs():
global maxCnt, num
while q:
start,cnt=q.popleft()
if start > 300000:
continue
if cnt > maxCnt or cnt > timeTable[start]:
continue
timeTable[start] = cnt
if start==K:
if cnt==maxCnt:
num+=1
else:
maxCnt=cnt
num=1
continue
q.append((start*2,cnt+1))
q.append((start+1,cnt+1))
q.append((start-1,cnt+1))
bfs()
print(maxCnt)
print(num)
반응형