programmers.co.kr/learn/courses/30/lessons/49189

 

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

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

programmers.co.kr

노드의 개수 int n, 각 노드의 연결 상태 int[][] edge 가 주어진다. (edge의 각 행 [a, b] 는 노드 a, b 사이가 연결되어있음을 뜻한다.)

 

시작 노드를 1번으로 하였을 때, 1번 노드에서 가장 멀리 떨어진 노드의 개수를 반환해야한다.

 

 

 

풀이 .

import java.util.*;

class Solution {

    ArrayList<Integer>[] list = null;
    boolean[] check = null;
    int[] dist = null;

    public void bfs(int start) {
        Queue<Integer> que = new LinkedList<>();
        que.add(start);
        check[start] = true;
        dist[start] = 1;

        while (!que.isEmpty()) {
            int now = que.poll();
            for (int i = 0; i < list[now].size(); i++) {
                int next = list[now].get(i);
                if (check[next] == false) {
                    que.add(next);
                    check[next] = true;
                    dist[next] = dist[now] + 1;
                }
            }
        }
    }

    public int solution(int n, int[][] edge) {
        int answer = 0;

        // 0번 인덱스는 무시하고 1번부터 사용
        list = new ArrayList[n + 1];
        check = new boolean[n + 1];
        dist = new int[n + 1];

        for (int i = 1; i <= n; i++) {
            list[i] = new ArrayList<>();
        }

        for (int[] connect : edge) {
            int u = connect[0];
            int v = connect[1];
            list[u].add(v);
            list[v].add(u);
        }

        bfs(1);

        int max = 0;
        for(int d : dist) if(max < d) max = d;
        for(int d : dist) if(max == d) answer++;

        return answer;
    }
}

 

최단 거리, 최장 거리 문제는 웬만해선 BFS로 해결된다.

 

BFS 는 현재 노드에서 1만큼 떨어진 노드들을 우선적으로 탐색하기 때문에 시작 노드에서부터의 거리를 공평하게 잴 수 있다.

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

[PG] 두 개 뽑아서 더하기 JAVA  (0) 2021.02.18
[PG] 크레인 인형뽑기 게임 JAVA  (0) 2021.02.18
[PG] 입국심사 JAVA  (0) 2021.01.04
[PG] 여행경로 JAVA  (0) 2021.01.04
[PG] 단어 변환 JAVA  (0) 2021.01.04

+ Recent posts