쾌락없는 책임 (공부)/알고리즘 문제풀이

[Algorithm] 프로그래머스 가장 먼 노드 - C++, BFS

허스크 2022. 2. 23. 12:31
반응형
 

코딩테스트 연습 - 가장 먼 노드

6 [[3, 6], [4, 3], [3, 2], [1, 3], [1, 2], [2, 4], [5, 2]] 3

programmers.co.kr

#include <string>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;

int solution(int n, vector<vector<int>> edge) {
    int answer = 0;
    int maxDistance = 0;
    vector<int> distance(n+1);
    vector<bool> visit(n+1);
    for(unsigned i = 0; i <= n; i++)
        distance[i] = 999999999;

    vector<vector<int>> road(n+1);
    for(unsigned i = 0; i < edge.size(); i++){
        int from = edge[i][0];
        int to = edge[i][1];

        road[from].push_back(to);
        road[to].push_back(from);
    }

    // bfs
    queue<pair<int, int>> q;  // node, cost
    q.push(make_pair(1, 0));
    while (!q.empty()){
        int curPos = q.front().first;
        int curCost = q.front().second;
        q.pop();

        for(unsigned i = 0; i < road[curPos].size(); i++){
            int nextPos = road[curPos][i];
            int nextCost = curCost+1;

            if(visit[nextPos])
                continue;

            if(distance[nextPos] >= nextCost){
                visit[nextPos] = true;
                distance[nextPos] = nextCost;
                q.push(make_pair(nextPos, nextCost));
            }
        }
    }
    
    for(unsigned i = 2; i <= n; i++)
        maxDistance = max(maxDistance, distance[i]);
    
    for(unsigned i = 2; i <= n; i++)
        if(distance[i] == maxDistance)
            answer++;

    return answer;
}

 프로그래머스 코테를 준비한다고 프로그래머스에서 풀어본 문제이지만 생각보다 실수한 부분들이 많아서 아쉬웠던 문제... 풀이 방법이 바로 떠올랐는데 더 빨리 풀 수 있지 않았을까 하는 아쉬움이 계속 남습니다.

 

 일단 풀이는 그냥 edge에 있는 정보들을 from, to로 분해를 한 다음 이를 통해 bfs 탐색을 해주고 distance란 배열에 이를 저장해 둔 뒤 maxDiatance를 구해 answer 를 측정하는 것이었습니다. maxDistance를 구하는 방법이 위 코드에서는 선형 탐색이라 아쉽기는 한데 당장 다른 아이디어가 생각나지 않아 이렇게 풀이했습니다.

 

그리고 실수한 부분들은

- visit 체크를 안해줌

- maxdistance를 비교할때 1번 노드를 계속 포함했음

이었습니다.

반응형