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

👀 문제

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

👊 도전

1. 설계

  1. ArrayList를 이용하여 그래프를 구현한다.
  2. boolean[] visited로 노드 방문을 체크하고, int[] count로 1에서부터 해당 노드까지의 길이를 저장한다.
  3. 거리가 가장 먼 노드들만을 세서 리턴한다.

2. 구현 (성공 코드)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import java.util.*;
/**
 *
 * @author HEESOO
 *
 */
class Solution {
    public int solution(int n, int[][] edge) {
        int answer = 0;
        //그래프 구현
        ArrayList<ArrayList<Integer>> list=new ArrayList<ArrayList<Integer>>();
        for(int i=0;i<edge.length;i++){
            list.add(new ArrayList<Integer>());
        }
        //노드 연결
        int a, b;
        for(int[] node:edge){
            a=node[0];
            b=node[1];
            list.get(a).add(b);
            list.get(b).add(a);
        }

        int[] count=new int[n+1];//1과의 거리 저장
        boolean[] visited=new boolean[n+1];//방문여부
        Queue<Integer> q=new LinkedList<>();
        q.add(1);//시작점
        visited[0]=visited[1]=true;//1에서 시작(0은 사용안함)
        int now;
        while(!q.isEmpty()){
            now=q.poll();
            for(int v:list.get(now)){//나와 연결된 노드들
                if(!visited[v]){//방문하지 않은 곳이라면
                    count[v]=count[now]+1;//1과의 길이 저장
                    visited[v]=true;
                    q.add(v);//이곳과 연결된 노드에 방문하기 위함
                }
            }
        }
        //System.out.println(Arrays.toString(count));
        int max=0;//1과 가장 멀리 떨어진 노드와의 길이 저장
        for(int cnt:count){
            if(max<cnt){//더 큰 길이가 있다면 그게 max
                max=cnt;
                answer=1;
            }
            else if(max==cnt) answer++;
        }
        return answer;
    }
}

3. 결과

실행결과 🤟 성공 🤟

4. 설명

  1. ArrayList를 이용하여 그래프를 구현한다. 실행결과
    • 노드가 1부터 시작하므로 0은 사용하지 않는다.
    • ArrayList<ArrayList>로 선언하여 리스트가 리스트를 원소로 가지게 한다.
  2. 큐로 노드들을 방문한다.
    • 1부터 시작해서 1과 연결된 노드들을 방문한다.
    • 이때 처음 방문하는 노드라면 1과의 거리를 count[i]에 저장한다.
  3. count[]로 1과 제일 멀리 떨어진 노드들의 갯수를 센다.
    • max는 0으로 초기화하여 이보다 더 큰 거리가 나오면 max값을 바꾸고, answer=1로 초기화한다.

👏 해결 완료!

코드 구현 자체는 어렵지 않았지만 아직도 문제를 보고 직접 풀기까지는 나에게 무리인 것 같다.

참고