본문 바로가기

알고리즘/프로그래머스

[프로그래머스] 가장 먼 노드

반응형

가장 먼 노드


1. 이해하기

  • 1번 노드에서 가장 먼 노드의 갯수를 구한다. 가장 멀리 떨어진 노드란 최단 경로로 이동했을 때 간선의 개수가 가장 많은 노드들을 의미한다.
  • bfs를 이용해서 구할 수 있다.

2. 구현하기

  • bfs를 이용하여 1번에서 각 노드까지의 거리를 구한다.

    • 그 이전에 edge로 주어진 각 노드들의 연결관계를 인접리스트로 바꾼다.
    void bfs() {
        queue<int> q;
        q.push(1);
        visited[1] = true;
        dist[1] = 0;
        while(!q.empty()) {
            int here = q.front();
            q.pop();
            for(int i = 0; i < adj[here].size(); i++) {
                int there = adj[here][i];
                if(visited[there]) continue;
                q.push(there);
                dist[there] = dist[here]+1;
                visited[there] = true;
            }
        }
    }
  • 거리 중에서 가장 큰 거리 값을 찾고 이 값과 같은 거리의 개수가 몇개 있는지를 찾는다.

    int solution(int n, vector<vector<int>> edge) {
        int answer = 0;
        for(int i = 0; i < edge.size(); i++) {
            int u = edge[i][0], v = edge[i][1];
            adj[u].push_back(v);
            adj[v].push_back(u);
        }
        int maxDist = 0;
        bfs();
        for(int i = 1; i <= n; i++) {
            maxDist = max(maxDist,dist[i]);
        }
        for(int i = 1; i <= n; i++) {
            if(maxDist == dist[i]) answer++;
        }
    
        return answer;
    }

3. 전체 코드

#include <string>
#include <vector>
#include <queue>
using namespace std;

vector<int> adj[20001];
int dist[20001];
bool visited[20001];

void bfs() {
    queue<int> q;
    q.push(1);
    visited[1] = true;
    dist[1] = 0;
    while(!q.empty()) {
        int here = q.front();
        q.pop();
        for(int i = 0; i < adj[here].size(); i++) {
            int there = adj[here][i];
            if(visited[there]) continue;
            q.push(there);
            dist[there] = dist[here]+1;
            visited[there] = true;
        }
    }
}

int solution(int n, vector<vector<int>> edge) {
    int answer = 0;
    for(int i = 0; i < edge.size(); i++) {
        int u = edge[i][0], v = edge[i][1];
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    int maxDist = 0;
    bfs();
    for(int i = 1; i <= n; i++) {
        maxDist = max(maxDist,dist[i]);
    }
    for(int i = 1; i <= n; i++) {
        if(maxDist == dist[i]) answer++;
    }

    return answer;
}

'알고리즘 > 프로그래머스' 카테고리의 다른 글

[프로그래머스] 예산  (0) 2019.11.18
[프로그래머스] 디스크 컨트롤러  (0) 2019.11.18
[프로그래머스] 단어 변환  (0) 2019.11.18
타일 장식물  (0) 2018.11.02
카펫  (0) 2018.10.28