Problem : 도망자 원숭이
유형 : 플로이드 워셜
문제 해석
- 원숭이가 목적지까지 도달하는 가장 짧은 시간을 구하라.
문제 재해석
- 원숭이는
최단 경로
로 이동하는 것을 원한다. - 각 도시간 이동할때 가중치가 입력으로 들어온다.
- 멍멍이는 원숭이를 최고 오래 괴롭힐 수 있는 도시 하나를 택한다.
해결 전략
- 목적지 쿼리가
1만개
까지 나올 수 있다. 플로이드 워셜
을 통해 최단 거리를 찾는다.-
이때 멍멍이가 괴롭히는 시간도 고려해야 한다.
- 플로이드 워셜에서
방문하는 도시
를 멍멍이가 가장적게
괴롭히는 곳부터 시작한다. - 왜냐하면, 멍멍이가 괴롭히는
가중치가 가장 작은곳 부터 진행
해야, 다른 경로를 갱신할 때, 이전 정보만 가지고 갱신 할 수 있게 된다. - 즉 가중치가 적은 정점만을 이용해서 최단거리를 갱신했으므로, 이후 작업에서 이전 정보를 토대로 최단거리를 갱신할 수 있게 된다.
구현, 설계
- 기본적인
플로이드 워셜
세팅을 한다. - 멍멍이가 선택할 위치를
dog_cost
로 저장한다. - 플로이드 워셜 중간 지점은
멍멍이가 가장 적게 괴롭히는 도시
부터 시작한다. - 플로이드 워셜 과정에서, 중간 지점을 방문할 경우, 두 지점 사이에서
가장 가중치가 높은 지점
을 선택한다. - 새롭게 가는곳이 최단 경로인 경우, 갱신한다.
주의할점
- 플로이드 워셜의 원리를 정확히 파악해야 한다.
- 가중치가 없는 경우에는 방문하는 도시의 순서가 중요하지 않으나,
가중치가 있는 경우에는 가장 적은 도시
부터 방문 해야한다.
디버깅
- 예제도 제대로 나오지 않던 코드를 제출해서 틀렸었다.
- 가중치를 고려하지 않고 플로이드를 돌렸었다.
코드
1 |
|
피드백
- 사실 혼자서 해결방법을 떠올리지 못했다.
- 질문 게시판의
kks227
님의 답변을 보고, 해결하였다. - 알고리즘을 공부할 때 그 원리를 정확히 파악 해두자.