https://www.acmicpc.net/problem/1697
DP 문제같아 보이는데 DP로는 풀기 어렵다고 한다. 그렇다고 왜 BFS로 풀어야 하는지도 처음에는 납득이 되지 않았다.
어찌됐건 1차원 배열의 BFS를 통해 답을 쉽게 찾을 수 있다. BFS를 수행하면서, 사용된 이동 방식 (X-1, X+1, X*2)을 별도의 배열 path에 저장하고 탐색이 끝나면 k에서부터 경로를 역추적하면 된다.
path에 저장하는 값을 아래와 같이 설정하면, 경로 추적 함수를 재귀적으로 간단하게 작성할 수 있다!
BFS(...) {
...
//X-1
path[next_pos] = -1;
//X+1
path[next_pos] = 1;
//X*2
path[next_pos] = cur_pos;
...
}
int findPath(int n, int k, int count) { //k에서 출발해 n까지 이동
if (n == k)
return count;
findPath(n, k - path[k], count + 1);
}
* BFS를 사용하는 이유 (추측)
왜 DP는 안되는가?
n <= k라는 보장이 없어 만약 n > k일 경우 계산이 복잡해지기 때문이다.
왜 DFS는 안되는가?
X-1, X+1에서 대부분의 경우 바로 이동해버리기 때문에, X*2 연산이 거의 시행되지 않아 최단 경로를 찾기 어렵기 때문이다.
'백준' 카테고리의 다른 글
백준 7576 - 토마토 (0) | 2023.07.06 |
---|---|
백준 11726 - 2xn 타일링 (0) | 2023.07.05 |
백준 1012 - 유기농 배추 (0) | 2023.07.04 |
백준 11724 - 연결 요소의 개수 (0) | 2023.05.20 |
백준 - 그리디 알고리즘 (0) | 2023.05.20 |