Tiny Bunny
본문 바로가기

programmers

프로그래머스 3단계 : 가장 먼 노드 (Java 자바)

728x90

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

노드의 개수 n, 간선에 대한 정보가 담긴 2차원 배열 vertex가 매개변수로 주어질 때, 1번 노드로부터 가장 멀리 떨어진 노드가 몇 개인지를 return 하도록 solution 함수를 작성해주세요.

 


제한사항

  • 노드의 개수 n은 2 이상 20,000 이하입니다.
  • 간선은 양방향이며 총 1개 이상 50,000개 이하의 간선이 있습니다.
  • vertex 배열 각 행 [a, b]는 a번 노드와 b번 노드 사이에 간선이 있다는 의미입니다.

 

입출력 예

1번 노드에서 가장 멀리 떨어진 노드는 4,5,6번 노드입니다.

 

 

풀이

BFS를 통해 주어진 그래프에서 시작 노드로부터 가장 먼 노드의 개수를 찾는 문제입니다. 큐(Queue)를 사용하여 방문할 노드를 관리하고, 방문한 노드를 표시하며, 각 BFS 레벨의 노드 수를 세어서 가장 먼 노드들의 개수를 구합니다.

 

1. visited 배열은 각 노드의 방문 여부를 기록하기 위한 배열입니다. true가 방문되었음을 나타내고, false가 방문되지 않았음을 나타냅니다.

2. relative 배열은 각 노드들 간의 연결 상태를 나타내기 위한 2차원 배열입니다. relative[x][y]가 true라면 노드 x와 y가 연결되어 있다는 뜻이며, 무방향 그래프이기 때문에 relative[y][x] 역시 true입니다.

3. solution 함수는 주어진 노드의 개수 n과 간선 정보 edge를 받아와서, BFS 탐색을 통해 가장 멀리 떨어진 노드의 개수를 계산하여 반환하는 함수입니다.

4. bfs 함수는 실제 BFS 탐색을 수행하는 함수입니다. 큐를 사용하여 BFS 탐색을 진행하며, 시작 노드부터 탐색하고, 각 노드의 이웃 노드를 탐색하면서 가장 먼 노드까지의 거리를 계산합니다.

 

import java.util.*;

class Solution {
    
    boolean[] visited;  // 각 노드의 방문 여부를 저장하는 배열
    boolean[][] relative;  // 노드들 간의 연결 정보를 나타내는 2차원 배열
    
    public int solution(int n, int[][] edge) {
        int answer = 0;  // 최종 답을 저장할 변수
        visited = new boolean[n + 1];  // 노드의 개수에 맞게 visited 배열 초기화
        relative = new boolean[n + 1][n + 1];  // 노드 간 연결을 나타내는 relative 배열 초기화
        
        answer = bfs(edge);  // BFS 메서드 호출하여 그 결과를 answer에 저장
        return answer;  // 최종 답 반환
    }
    
    public int bfs(int[][] edge) {
        Queue<Integer> queue = new LinkedList<>();  // BFS 탐색을 위한 큐 생성
        queue.offer(1);  // 시작 노드인 노드 1을 큐에 추가
        visited[1] = true;  // 시작 노드 방문 처리
        
        // 주어진 간선 정보를 바탕으로 relative 배열을 채움
        for (int i = 0; i < edge.length; i++) {
            int x = edge[i][0];  // 간선의 첫 번째 노드
            int y = edge[i][1];  // 간선의 두 번째 노드
            
            relative[x][y] = true;  // x에서 y로의 연결 표시
            relative[y][x] = true;  // 양방향 그래프이므로 y에서 x로의 연결도 표시
        }
        
        int size = 0;  // 각 BFS 레벨의 노드 수를 저장할 변수
        
        // BFS 탐색 시작
        while (!queue.isEmpty()) {  // 큐가 비어있지 않은 동안 반복
            size = queue.size();  // 현재 레벨의 노드 수를 저장
            
            for (int i = 0; i < size; i++) {  // 현재 레벨의 노드들을 하나씩 처리
                int current = queue.poll();  // 큐에서 현재 노드를 꺼내옴
                
                // 현재 노드의 이웃 노드들을 탐색
                for (int j = 1; j < visited.length; j++) {
                    if (!visited[j] && relative[current][j]) {  // 이웃 노드가 미방문이고 연결되어 있을 때
                        visited[j] = true;  // 이웃 노드 방문 처리
                        queue.add(j);  // 이웃 노드를 큐에 추가하여 다음 레벨에 탐색
                    }
                }
            }
        }
        
        return size;  // 마지막 레벨의 노드 수를 반환, 이것이 시작 노드에서 가장 멀리 떨어진 노드의 개수
    }
}
728x90