알고리즘 문제
프로그래머스 - 가장 먼 노드 (C++)
als982001
2023. 2. 27. 13:56
https://school.programmers.co.kr/learn/courses/30/lessons/49189
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
이 문제는 전형적인 다익스트라 알고리즘 문제이다. 다익스트라 알고리즘으로 문제를 풀기 위해서, 주어진 edges에서 주어진 vertex 배열에서 노드 a와 노드 b 사이의 거리를 1로 둔 다음 알고리즘을 이용하면 된다. 이 문제를 풀기 위해 구상한 절차는 다음곽 같다.
- 주어진 vertex 배열의 정보를 다익스트라 알고리즘에 이용할 수 있게 변형시켜 저장한다.
- 시작 노드(1번 노드)부터 다른 노드까지의 최소 거리를 저장할 변수(배열)의 값을 최대한 크게 초기화한다.
- 다익스트라 알고리즘을 이용해 시작 노드부터 각 노드까지의 최소 거리를 계산한다.
- 거리의 최대값과 이 때의 노드의 개수를 저장할 변수를 이용하여, 모든 거리를 비교한다.
- 현재 검사하는 노드까지의 거리가, 저장된 최대값보다 크다면 최대값을 저장한 후, 노드의 개수는 1로 설정한다.
- 현재 검사하는 노드까지의 거리가, 저장된 쵀대값과 같다면, 노드의 개수를 1 증가시킨다.
#include <string>
#include <vector>
#include <queue>
#include <map>
using namespace std;
#define MAX 20011
#define START 1
int dist[MAX];
vector<int> links[MAX];
int Check(int nodeNum)
{
int maxDist = -1;
int maxDistNum = 0;
priority_queue<pair<int, int>> pq;
pq.push({ START, 0 });
dist[START] = 0;
while(!pq.empty())
{
int curNode = pq.top().first;
int curDist = -pq.top().second;
pq.pop();
if (dist[curNode] < curDist)
continue;
for (int i = 0; i < links[curNode].size(); ++i)
{
int nxtNode = links[curNode][i];
int nxtDist = curDist + 1;
if (dist[nxtNode] > nxtDist)
{
dist[nxtNode] = nxtDist;
pq.push({ nxtNode, -nxtDist });
}
}
}
for (int node = 2; node <= nodeNum; ++node)
{
if (maxDist < dist[node])
{
maxDist = dist[node];
maxDistNum = 1;
}
else if (maxDist == dist[node])
++maxDistNum;
}
return maxDistNum;
}
int solution(int n, vector<vector<int>> vertex)
{
for (int i = 0; i < MAX; ++i)
dist[i] = MAX + MAX + MAX;
for (int i = 0; i < vertex.size(); ++i)
{
int nodeA = vertex[i][0];
int nodeB = vertex[i][1];
links[nodeA].push_back(nodeB);
links[nodeB].push_back(nodeA);
}
int answer = Check(n);
return answer;
}