:: ADVANCE ::
[BaekJoon][2842] 집배원 한상덕 본문
BAEKJOON ONLINE JUDGE
https://www.acmicpc.net/problem/2842
처음 접하는 이진탐색... 이라고 해야하나
일단 처음 풀이는 이진 탐색 문제집에서 열어본 문제기 때문에 이진탐색이라는 점을 염두해 두고 풀이를 접근해 보았다. 또한 이전에 풀었던 '배열에서 이동' 문제가 생각나서 이와 비슷한 문제라고 생각을 하였다.
but, '배열에서 이동'처럼 문제를 접근하기에는 고도 값이 매우 크기 때문에 time limit이 날 수 밖에 없다.
1. 다익스트라
일단 이진탐색으로 고도의 최소값을 정해놓고, 그 중 P에서 K로 가는 경로의 최대값을 파악했다.
될 수 있는 최소 고도의 최대값을 이진탐색으로 찾고, 0부터 최소 고도의 최대값까지 다익스트라를 돌리면서 이 중 피로도가 최소인 값을 정답으로 하였다.
최대값을 정하지 않고 최소값 구하기 위한 이진탐색은 기준이 되는 최소값 보다 큰 값을 고도로 갖는 경로 중에서 배달을 완수할 수 있는지의 여부로 탐색하였다.
=> 최소 고도의 최대값을 찾았다고 해서 피로도가 최소는 아니다!
이진탐색으로 구한 값은 경로 고도의 최소값이 [range[0], range[e]]에 속하면 갈 수 있다는 뜻이므로, 이 경우를 모두 돌아보며 피로도의 최소를 구해야 한다.
또한 여기서 중요한 것이
문제의 정답이 될 수 있는 최대, 최소 고도는 입력으로 받는 고도값 중 하나가 될 것이다.
따라서 이진탐색의 탐색 범위를 고도 값이 아닌 입력받은 고도값으로 탐색을 해 나가면 시간을 훨씬 줄일 수 있다.
-> 452ms
2. dfs + 이진탐색
이제까지 이진탐색을 해본 것 중 새로운 방식이었다.
최소-최대 고도는 입력받은 값 중에 하나로, 이를 자벌레 마냥 늘리고 줄여가며 피로도의 최소값을 찾는 방식이다.
배달을 완수할 수 있는지는 dfs로 탐색하면서 만나는 K의 개수가 전체 K의 개수와 동일하면 배달을 완수할 수 있다는 지표로 삼았다.
시작, 끝을 가장 작은 고도 값으로 시작하여
배달을 할 수 있으면 시작++하여 피로도를 줄였고, 배달을 할 수 없으면 (끝++)끝값을 증가시켜 배달하는 경로의 고도 범위를 늘려주었다.
이렇게 배달 범위를 늘려갈 수 있는 이유는
어떠한 시작 - 끝 범위에서 배달이 가능하다면 그 끝값 이후의 더 큰값을 끝으로 정해도 무조건 가능하기 때문이다.
-> 128ms
솔직히 무슨 설명을 하는건지 모르겠네...
'Algorithm > Binary Search' 카테고리의 다른 글
[BaekJoon][2792] 보석 상자 (0) | 2016.10.10 |
---|---|
[BaekJoon][3649] 로봇 프로젝트 (0) | 2016.10.09 |
[BaekJoon][3079] 입국심사 (0) | 2016.10.09 |
[BaekJoon][3020] 개똥벌레 (0) | 2016.10.09 |
[BaekJoon][10816] 숫자 카드 2 (0) | 2016.10.09 |