Algorithm(c++)/Level 3
[프로그래머스] Level 3. 가장 먼 노드
devchop
2025. 3. 5. 10:29
https://school.programmers.co.kr/learn/courses/30/lessons/49189
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
다익스트라를 구한 뒤, 가장 값이 큰 거리의 개수를 구하는 문제이다. 오랜만에 하니까 또 굉장히 헷갈렸다.
- A에 연결된 간선을 빠르게 파악하기 위해서 인자로 전달받은 edge를 graph로 변경한다. graph[1] 은 1번 노드에 연결된 모든 간선이 vector 안에 담겨있다.
- 다익스트라 알고리즘은 1번부터 시작하여, 옆노드의 거리를 갱신한 뒤 다음 검사노드를 찾기 위해서 priority queue가 필요하다. 현재 검사하지 않은 노드 중 가장 거리가 적은 노드먼저 검사하는것이 다익스트라의 기본이다. 이를 위해 pair<int,int> 를 이용한다. first값은 거리로, pq에서 거리순으로 정렬될수 있게끔 한다. second값은 노드의 번호이다.
#include <string>
#include <vector>
#include <climits>
#include <queue>
using namespace std;
int solution(int n, vector<vector<int>> edge) {
vector<vector<int>> graph(n + 1);
// 그래프 생성 (무향 그래프)
for (auto &e : edge) {
graph[e[0]].push_back(e[1]);
graph[e[1]].push_back(e[0]);
}
// 다익스트라 알고리즘을 위한 최소 힙 (우선순위 큐)
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;
vector<int> dist(n + 1, INT_MAX); // 최소 거리 배열
// 시작점 (1번 노드)
dist[1] = 0;
pq.push({0, 1}); // (거리, 노드)
while (!pq.empty()) {
int current_dist = pq.top().first;
int current_node = pq.top().second;
pq.pop();
// 현재 저장된 거리보다 크다면 무시
if (current_dist > dist[current_node]) continue;
// 인접한 노드들 검사
for (int next : graph[current_node]) {
int new_dist = current_dist + 1; // 가중치 1
if (new_dist < dist[next]) {
dist[next] = new_dist;
pq.push({new_dist, next});
}
}
}
// 가장 먼 거리 찾기
int maxDist = 0;
int answer = 0;
for (int i = 1; i <= n; i++) {
if (dist[i] == INT_MAX) continue; // 연결되지 않은 노드는 제외
if (dist[i] > maxDist) {
maxDist = dist[i];
answer = 1;
} else if (dist[i] == maxDist) {
answer++;
}
}
return answer;
}