오늘의 알고리즘

[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도 써봤네

이해해놓고 계속 봐야겠군