코테/BOJ
백준 13913 [숨바꼭질4] 파이썬
동 캄
2025. 2. 21. 00:22
반응형
https://www.acmicpc.net/problem/13913
생각보다 쉽지 않았다...ㅠ
#백준 13913 숨바꼭질
from collections import deque
N,K=map(int,input().split())
if K<N: #K가 N보다 작은경우 --> 빼기 밖에 없으므로 그냥 출력
lst=[i for i in range(N,K-1,-1)]
print(len(lst)-1)
print(*lst)
elif N==K: # K와 N이 같은 경우 그냥 출력
print(0)
print(N)
else: #K가 N보다 큰 경우
dic=dict()
visited=[-1]*(2*K+2)
q=deque()
q.append(N)
dic[N]=-10
visited[N]=0
while q: #BFS를 이용하면 정답을 찾은순간이 무조건 최소값이 보장된다.
curr_pos=q.popleft()
if curr_pos!=K:
if curr_pos !=0 and curr_pos*2 < 2*(K+1) and visited[curr_pos*2]==-1: # 곱하기 두배
dic[curr_pos*2]= curr_pos
visited[curr_pos*2]=visited[curr_pos]+1
q.append(curr_pos*2)
if visited[curr_pos+1]==-1: # 더하기 1
dic[curr_pos+1]=curr_pos
visited[curr_pos+1]=visited[curr_pos]+1
q.append(curr_pos+1)
if curr_pos>0 and visited[curr_pos-1]==-1: # 빼기 1
dic[curr_pos-1]=curr_pos
visited[curr_pos-1]=visited[curr_pos]+1
q.append(curr_pos-1)
elif curr_pos==K: #숨바꼭질 찾은경우 딕셔너리를 통해 정답 --> 이전 값 --> 이전 값 --> ... --> 초기 값 순으로 순서 확인 가능
print(visited[curr_pos])
lst=[]
val=K
while val!=-10:
lst.append(val)
val=dic[val]
lst.reverse()
print(*lst)
break
처음에 큐를 여러개 생성해서 해결하려고 하였으나, 메모리초과가 발생하여, 딕셔너리로 해결하였다.
연결리스트처럼 이전값을 저장하여 사용하는 방식으로 코드 작성하니 시간이 적게 소모되었다.
반응형