#13549 숨바꼭질3 https://www.acmicpc.net/problem/13549
13549번: 숨바꼭질 3
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
신기한 문제였다. BFS를 공부하다가 만난 문제이지만 사실 BFS를 통한 풀이가 온전한 풀이가 아니라는것.
문제는 점프라는 행위에 있다.
다른 행위와는 달리 점프에 소요되는 비용은 0이다.
그래프 내에서 가중치가 0이라는 말이다.
모든 엣지의 가중치가 동일할 때 정확한 수행능력을 보여주는게 BFS알고리즘이다.
그렇기 때문에 가중치가 다른 위 문제에서는 오류가 발생하기 쉽다.
정확한 해법
- 디익스트라 알고리즘 (뭔지모름)
- 0-1 BFS (뭔지 모름) : 가중치가 0인 간선에 연결된 정점은 큐의 맨 뒤가 아닌 맨 앞에 넣는 방법
- *2를 별도의 간선으로 생각하지 않고, +1이나 -1에 의한 좌표를 큐에 넣을 때 그 좌표의 거듭제곱 배인 좌표들을 전부 큐에 넣는 방법
위 세가지 방법으로 해결할 수 있다고 한다. 나중에 더 알아보자.
참조 : https://www.acmicpc.net/board/view/38887#comment-69010
N, T = map(int, input().split())
M = 10**5
dist = [0]*(M+1)
def solve(position):
que = []
que.append(position)
while que:
p = que.pop(0)
if p == T:
return p
for np in [p*2, p-1, p+1]:
if 0 <= np <= M and not dist[np]:
if np == p*2:
dist[np] = dist[p]
que.append(np)
else:
dist[np] = dist[p]+1
que.append(np)
solve(N)
print(dist[T])
일단 내가 많은 자료들을 찾아보며 작성한 코드이다.
처음에는 다른 숨바꼭질 문제들과 다를 바 없이 p-1부터 시작했는데 틀린 답이 나왔다.
p*2부터 시작하면 정답이 나온다는 사실이 조금 당황스러웠는데
위에서 제시한 세 가지 방법 중 마지막 방법과 조금 연관이 있을거라 짐작해본다.
'Algorithm > acmicpc.net' 카테고리의 다른 글
0-1 BFS를 처음 성공한 날. (0) | 2022.02.05 |
---|---|
모자란건 고민하는 시간인가 재능인가 (0) | 2022.02.04 |
메모리를 아껴보자 (0) | 2022.01.30 |
골드 4인데도 막힌... (0) | 2022.01.28 |
왜 점점 멍청해지는 기분이..? (0) | 2022.01.27 |