알고리즘 스터디 6월 4주차 문제2 (가장 먼 노드)

문제#

  • 링크로 대체

풀이 및 주저리..

프로그래머스에 있는 그래프 문제중 첫번째 문제인 가장 먼 노드이다. 그래프..? BFS? 같이 공식적으로 머리가 진행되면서 문제를 어떻게 풀어야할까 접근했다. 먼저 각 노드에서 간선들을 맵 형태로 저장했고 반대일 경우도 생각해야하므로 맵에 들어있는 노드별로 간선들을 넣어주었다. 그 후에는 BFS를 활용해서 각 선에서 갈 수 있는 거리를 배열로 저장해준다음 마지막에 배열을 순회하면서 최대값일때의 개수를 세어주었다. 처음에 기본 값 0일때 해결하려다가 노드가 1일때의 처리가 잘 되지 않아서 배열의 초기값을 -1로 설정해주고 진행하게되었다. 리팩토링 하다보면 좀 더 좋은 코드가 나올 수 있을 것 같다.

코드

package programmers.graph;

import java.util.*;

public class FarthestNode {
    public int solution(int n, int[][] edge) {
        int answer = 0;
        int[] numCntArr = new int[n + 1];
        Arrays.fill(numCntArr,-1);
        numCntArr[1] = 0;
        HashMap<Integer, Set<Integer>> numMap = new HashMap<>();
        Queue<Integer> que = new LinkedList<>();
        que.add(1);
        for (int[] node : edge) {
            Set<Integer> list = numMap.getOrDefault(node[0], new HashSet<>());
            Set<Integer> revList = numMap.getOrDefault(node[1], new HashSet<>());
            list.add(node[1]);
            revList.add(node[0]);
            numMap.put(node[0], list);
            numMap.put(node[1], revList);
        }

        while (!que.isEmpty()) {
            int p = que.poll();
            Set<Integer> numSet = numMap.get(p);
            for (Integer i: numSet) {
                if(numCntArr[i] != -1) continue;
                numCntArr[i] = numCntArr[p] + 1;
                que.add(i);
            }
        }
        int temp = 0;
        for(int i = 1 ; i< numCntArr.length; i++){
            if(numCntArr[i] > temp){
                answer = 1;
                temp = numCntArr[i];
            }else if(temp == numCntArr[i]){
                answer++;
            }
        }
        return answer;
    }
}

기억에 남길 것!

  • 시작의 예외처리 유의
© 2020 JunhoBaik, Built with Gatsby