본문 바로가기

Problem Solving/Baekjoon

[백준 9370 C++] 미확인 도착지

오늘은 백준(BOJ) 9370번 미확인 도착지 문제에 대해 다뤄볼 예정이다.

미확인 도착지 문제 링크 (백준(BOJ) 9370번 문제): https://www.acmicpc.net/problem/9370

 

9370번: 미확인 도착지

(취익)B100 요원, 요란한 옷차림을 한 서커스 예술가 한 쌍이 한 도시의 거리들을 이동하고 있다. 너의 임무는 그들이 어디로 가고 있는지 알아내는 것이다. 우리가 알아낸 것은 그들이 s지점에서

www.acmicpc.net

 

문제 설명 

백준 9370번 미확인 도착지 문제는 시작 위치에서 목적지 까지 최단거리로 갔을 때, 특정 경로(h->g 혹은 g->h)를 거쳐서 간 경우에 목적지를 출력하는 문제이다. 

미확인 도착지 예제

위 그래프를 예시로 들자면, 시작 위치(2)에서 도착 위치(5, 6)에 최단 거리로 갈 때, 특정 경로(1과3 사이의 Path [h->g 혹은 g->h])를 거친 후 도착한 경우 목적지를 출력 해준다. 

 

문제 풀이 

백준 9370번 미확인 도착지 문제의 핵심은 S -> G -> H -> D 혹은 S -> H -> G -> D 의 경로로 최단 거리를 구해주는 것이다. 

다음으로, 다익스트라 알고리즘 코드 구현이 중요하다고 볼 수 있다. 그 이유는 다익스트라 알고리즘 코드 때문에 해당 문제에서 66%에서 계속 시간 초과를 냈었기 때문이다....

 

66%에서 시간 초과를 나게 했었던 코드는 우선 순위 큐 때문이었다. 

문제의 코드: priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>> pq ; 

우선 순위 큐를 선언할 때, 음수 값으로 접근하지 않고 우선 순위 큐 안에서 pair에 첫 번째 요소를 기준으로 낮은 Weight 이 앞에 오도록 해주는 greater<pair<int,int>> 를 사용했었다. 

이 코드를 사용하게 되니, 노드 수가 엄청 많아졌을 때, 시간 초과가 발생하게 되었던 것 이었다. 

 

실제로 clock_t를 통해 테스트 해본 결과, greater<pair<int,int>> 를 사용한 경우가 시간이 더 높게 측정 되었다. 

 

해결 코드: priority_queue<pair<int,int>> pq ; 

이와 같은 방식으로 우선 순위 큐를 선언한 후, Weight 값을 음수로 첫 번째 요소에 넣어주어 구현을 하게 되면 시간 초과를 막을 수 있을 것이다. 

 

이를 코드로 옮기면 아래와 같다. 

 

'Problem Solving > Baekjoon' 카테고리의 다른 글

[백준 1300 C++] K번째 수  (0) 2021.09.26
[백준 10282 C++] 해킹  (0) 2021.09.25
[백준 5719 C++] 거의 최단 경로  (0) 2021.09.22
[백준 2211 C++] 네트워크 복구  (0) 2021.09.22
[백준 11000 C++] 강의실 배정  (0) 2021.09.22