가장 먼 노드

태그: , ,

카테고리: ,


출처 프로그래머스 - 가장 먼 노드

사용 언어 자바

입력

  • 노드 갯수 n
  • 양방향 간선 배열(가중치 없음)

제한사항

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

1번 노드에서 출발했을때 가장 먼 거리에 해당하는 노드들의 갯수를 반환하시오

이 문제는 생각없이 풀었다가 시간 복잡도가 초과되어 통과하지 못했었다
쓸데없이 괜히 스트림을 써봤다

제출 답안

public int solution(int n, int[][] edge) {
    int max = 0;
    int[] nodes = new int[n];
    for (int i = 1; i < n; i++) nodes[i] = 50000;
    List<Integer> visited = new ArrayList<>();
    List<Integer> willGo = new ArrayList<>();
    willGo.add(1);

    List<Integer>[] bridges = new ArrayList[n];
    for (int i = 0; i < n; i++) bridges[i] = new ArrayList<>();
    for (int[] i : edge) {
        bridges[i[0] - 1].add(i[1]);
        bridges[i[1] - 1].add(i[0]);
    }

    while (!willGo.isEmpty()) {
        int arrived = willGo.remove(0);
        for (int near : bridges[arrived - 1]) {
            nodes[arrived - 1] = Math.min(nodes[arrived - 1], (nodes[near - 1] + 1));
            if (!visited.contains(near) && !willGo.contains(near)) willGo.add(near);
        }
        visited.add(arrived);
        max = Math.max(max, nodes[arrived - 1]);
    }
    int finalMax = max;
    return (int) Arrays.stream(nodes).filter(i -> i == finalMax).count();
}

댓글남기기