알고리즘 Archive
[백준] 1697 - 숨바꼭질
희롭
2021. 3. 24. 22:11
from collections import deque
n, k = map(int, input().split())
# 하나씩 끝까지 파볼(dfs) 필요 없이, 가까운 노드부터 확인하다가
# 종착점 도착하면 끝내면 되므로 BFS!!
def bfs():
que = deque()
que.append(n)
while que:
x=que.popleft()
if x==k:
print(dist[x])
break
for nx in (x-1,x+1,x*2):
# dist[nx]=0(False)이어야 아래가 참이 됨.(이유:재방문 못하게)
if 0<=nx<=10**5 and not dist[nx]:
# 첫 시작 노드에서부터 퍼져나가는 노드에
# +1씩 해주면서 연산횟수 표시함
# 그러다가 n=k되는 순간오면 바로 멈추면 되니까
# 다시 방문할 수 없도록 if문에 and not dist[nx]
# (그래서 BFS 방식을 사용하는 거기도 하고)
dist[nx]=dist[x]+1
q.append(nx)
dist = [0]*(10**5+1)
bfs()
- 풀이 평가 : 1시간 정도 고민했는데 못풀었다ㅠㅠ
- 풀이 핵심 아이디어 :
- DFS가 아닌 BFS 사용!!! (따라서 queue 사용)
⇒ 하나씩 끝까지 파볼(dfs) 필요 없이, 가까운 노드부터 확인하다가 종착점 도착하면 끝내면 되므로 BFS!! - 도달할 수 있는 모든 거리(0~100,000)로 리스트 세운 후, 방문 순서를 표시해준다!
⇒ 추가 설명 : 첫 시작 노드에서부터 퍼져나가는 노드에 +1씩 해주면서 연산횟수 표시하다가, n=k되는 순간오면 바로 멈춘다는 소리
⇒ 이때 방문 순서란, 제일 상위 노드는 1, 그 다음 가지 노드들은 2, 이런식으로... 그러다 k에 도달하면 break 되어서 결과값 출력하게 함. - 재방문 막기 위한 장치 : if문에 and not nx(현재노드에 대한 위치 표시 리스트)으로 거른다
- DFS가 아닌 BFS 사용!!! (따라서 queue 사용)