오늘의 알고리즘
[C++]그래프가장 먼 노드(프로그래머스 3레벨)
하늘하늘 .
2022. 2. 8. 22:00
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int solution(int n, vector<vector<int>> edge)
{
// 연결된 노드들
vector<vector<int>> vecNode(n + 1);
// 까지 가는데 걸린 길이
vector<int> vecNodeLen(n + 1, 0);
// 방문 했는가
vector<bool> vecVisited(n + 1, false);
queue<int> queue = {};
int iNode = 0;
int iNextNode = 0;
int answer = 0;
// 연결시키기
for (int i = 0; i < edge.size(); i++)
{
vecNode[edge[i][0]].push_back(edge[i][1]);
vecNode[edge[i][1]].push_back(edge[i][0]);
}
// 처음 시작은 1
queue.push(1);
vecVisited[1] = true;
while (!queue.empty())
{
// 다음것에 큐를 넣어야하기 때문에 빼고 시작
iNode = queue.front();
queue.pop();
// DFS는 가까운 거리들을 모두 넣는 거니까 가까운 거리들 넣기
for (int i = 0; i < vecNode[iNode].size(); i++)
{
iNextNode = vecNode[iNode][i];
// 방문을 안했다면 방문
if (!vecVisited[iNextNode])
{
vecVisited[iNextNode] = true;
vecNodeLen[iNextNode] = vecNodeLen[iNode] + 1;
queue.push(iNextNode);
}
}
}
// 길이가 젤 긴 것들을 기준으로 소트
sort(vecNodeLen.begin(), vecNodeLen.end(),greater<>());
for (int i = 0; i < vecNodeLen.size(); ++i)
{
if (vecNodeLen[0] != vecNodeLen[i])
break;
answer++;
}
return answer;
}
처음에 재귀로 들어가서 엄청 헤맸다.
BFS인가 DFS인가 어떤 걸 써야 하나 싶었는데 BFS 써보고 아니다 싶어서 큐를 썼다.
그 뒤에는 길이 체크, 방문 체크 두 개를 했어야 해서 헤맸었다.
그래도 BFS만 써봤는데 DFS도 써봤네
이해해놓고 계속 봐야겠군