2020 KAKAO 인턴십 문제였다.
처음엔 문제만 보고 단순히 Backtracking을 이용하면 될 것이라 생각했다.
내가 고려했던 것은 아래와 같다.
- Backtracking으로 경로를 모두 탐색한다.
- 코너를 도는 지 안도는 지는 이전 탐색에서 넘어온 매개변수로 판단.
- 이 때 까지 계산한 값보다 커지면 Return 함으로써 Cut.
1차 시도 : Backtracking(DFS)
예상은 했지만, \(1/3\)의 Case가 시간초과가 발생했다.
내 Code를 확인을 해보니, 계산된 min_cost의 값이 너무 늦게 작아지는게 문제였다.
2차 시도 : Backtracking + DP
결국 구글의 힘을 빌렸다.
다른 사람들의 풀이를 보니, DP와 DFS를 합쳐서 풀었음을 알 수 있었다.
DP가 사용이 가능한 이유는,
내가 마지막 도착점에서 비용이 최소가 되려면,
어떤 경로든 (x, y)
까지의 비용이 최소로 유지가 되어야 하기 때문이다.
그리고 또, DFS를 이용하기 때문에 탐색하는 4방향의 순서도 문제가 되었다.
우 상 좌 하
의 순서대로 탐색을 하니 통과가 가능했다.