Programmers/Level 3
C++ / 프로그래머스 / 가장 먼 노드
GitHubSeob
2023. 7. 9. 04:29
문제 |
https://school.programmers.co.kr/learn/courses/30/lessons/49189
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제풀이 |
문제를 보자마자 두 가지 방법이 생각났다.
하나는 BFS를 이용한 풀이고, 다른 하나는 다익스트라 알고리즘을 이용한 풀이이다.
이번 풀이에서는 다익스트라 알고리즘을 사용했다.
문제를 보면 1번 노드에서 가장 먼 노드를 구해야 한다.
간선은 양방향 간선이므로 주어진 배열을 가지고 따로 (n+1) * (n+1)크기의 벡터를 만들어 연결이 되면 1을 저장한다.
(1번 노드부터 시작하므로 편의성을 위해 노드보다 하나 더 큰 사이즈로 만듦)
다익스트라의 기본 틀과는 크게 다르지 않다.
다만 가장 먼 노드의 개수를 구해야 하므로 우선순위 큐가 비어 반복문이 종료되었다면, 최댓값보다 큰 값이 나오면 갱신하고 개수를 초기화한다.
최댓값과 같은 값이 나오면 개수를 늘리면 된다.
코드 |
#include <vector>
#include <queue>
#include <algorithm>
#define MAX 50001
using namespace std;
int node_cnt, answer;
vector<vector<bool>>graph;
void Dijkstra(int start_node) {
int next(0), node(0), dist(0), n_dist(0), max_dist(0);
priority_queue<pair<int, int>>pq;
vector<int>dist_v(node_cnt + 1, MAX);
dist_v[start_node] = 0;
pq.push({ 0, start_node });
while (!pq.empty()) {
dist = -pq.top().first;
node = pq.top().second;
pq.pop();
for (next = 1; next <= node_cnt; ++next) {
n_dist = graph[node][next];
if (n_dist == 0) continue;
if (dist_v[next] > dist + n_dist) {
dist_v[next] = dist + n_dist;
pq.push({ -dist_v[next], next });
}
}
}
for (next = 1; next <= node_cnt; ++next) {
if (max_dist < dist_v[next]) {
answer = 1;
max_dist = dist_v[next];
}
else if (max_dist == dist_v[next]) {
answer++;
}
}
}
int solution(int n, vector<vector<int>> edge) {
int idx(0), idx2(0);
node_cnt = n;
graph = vector<vector<bool>>(n + 1, vector<bool>(n + 1, false));
for (idx = 0; idx < edge.size(); ++idx) {
graph[edge[idx][0]][edge[idx][1]] = 1;
graph[edge[idx][1]][edge[idx][0]] = 1;
}
Dijkstra(1);
return answer;
}