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

Yoon Uk·2023년 3월 11일
0
post-thumbnail
post-custom-banner

문제

[프로그래머스] 가장 먼 노드
https://school.programmers.co.kr/learn/courses/30/lessons/49189

풀이

조건

  • n개의 노드가 있는 그래프가 있습니다. 각 노드는 1부터 n까지 번호가 적혀있습니다.
  • 가장 멀리 떨어진 노드란 최단경로로 이동했을 때 간선의 개수가 가장 많은 노드들을 의미합니다.
  • 1번 노드에서 가장 멀리 떨어진 노드의 갯수를 구하려고 합니다.

풀이 순서

  • ArrayList 배열을 생성해 그래프를 만든다.
    • 양방향 그래프로 만든다.
  • BFS를 사용해 각 노드와 1번 노드 사이의 최단 거리를 구한다.
  • 최단 거리 중 가장 먼 거리를 BFS 탐색 중에 구한다.
  • 구한 최단 거리 중 가장 먼 거리와 같은 거리를 가진 노드의 수를 구한다.

코드

Java

import java.util.*;

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

        // ArrayList 배열 선언 및 초기화
        List<Integer>[] graph = new ArrayList[n + 1];
        for (int i = 1; i <= n; i++) {
            graph[i] = new ArrayList<Integer>();
        }
        
        // 간선 정보 입력
        for (int[] info : edge) {
            int s = info[0];
            int e = info[1];

            graph[s].add(e);
            graph[e].add(s);
        }

        // BFS로 각 노드의 최단거리 구하기
        Queue<Integer> que = new LinkedList<>();
        int[] dist = new int[n + 1]; // 각 노드와 1번 노드의 최단거리 저장할 배열
        boolean[] checked = new boolean[n + 1];

        que.add(1);
        checked[1] = true;
        int far_dist = 0; // 가장 멀리 있는 노드의 거리 저장할 배열

        while (!que.isEmpty()) {
            int now = que.poll();

            if (far_dist < dist[now]) {
                far_dist = dist[now];
            }

            for (int nxt : graph[now]) {
                if (checked[nxt]) continue;

                que.add(nxt);
                checked[nxt] = true;
                dist[nxt] = dist[now] + 1;
            }
        }
        
        // 가장 멀리 떨어진 거리와 같은 노드의 개수 구하기
        for (int i = 2; i <= n; i++) {
            if (dist[i] == far_dist) {
                answer++;
            }
        }

        return answer;
    }
}

정리

  • ArrayList 배열을 선언하고 초기화 하는 연습을 했다.
post-custom-banner

0개의 댓글