강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

라뗴님의 프로필 이미지
라뗴

작성한 질문수

2026 코딩테스트 올인원 [JAVA]

[문제풀이] network delay time

[문제풀이] network delay time

해결된 질문

작성

·

15

·

수정됨

0

  • 학습 관련 질문을 남겨주세요. 구체적으로 적을수록 좋아요!

  • 마크다운과 단축키를 활용하면 글을 더 편하게 작성할 수 있어요.

  • 커뮤니티 질문 & 답변에 비슷한 내용이 있었는지 먼저 검색해보세요.

편하게 질문주세요:) 직접 답변 드리도록 하겠습니다~

정답 풀이 코드가 이상한거 같아요 ,,!

  1. e1[2] - e2[2] 로 코드를 구성하면 OutOfBound에러가 발생해요~


    e1[0] - e2[0] 이렇게 구성해야하는게 아닌가요 ?

     

  2. curCost + edge[0] 에서 edge[0]가중치가 아니라 출발 노드 이므로edge[2] 을 더 하는게 맞지 않나요? curCost + edge[2]

     

  3. new int[]{curNode, nextCost}
    큐에 {curNode, nextCost} 추가 → 배열 형식이 {cost, node}여야 하는데 순서와 값이 모두 잘못된거같은데 맞을까요 ?

    public class NetworkDelayTime {
      public int solution(int[][] times, int n, int k) {
        // 그래프 구현
        Map<Integer, List<int[]>> graph = Arrays.stream(times)
        .collect(Collectors.groupingBy(t -> t[0]));
    
        // 다익스트라 알고리즘
        Map<Integer, Integer> costs = new HashMap<>();
        Queue<int[]> pq = new PriorityQueue<>((e1, e2) -> e1[0] - e2[0]);
        pq.add(new int[]{0, k});
    
        while (!pq.isEmpty()) {
          int[] cur = pq.remove();
          int curCost = cur[0];
          int curNode = cur[1];
          if (!costs.containsKey(curNode)) {
            costs.put(curNode, curCost);
            if (!graph.containsKey(curNode)) continue;
            for (int[] edge : graph.get(curNode)) {
              int nextCost = curCost + edge[2];
              pq.add(new int[]{nextCost, edge[1]});
            }
          }
        }
        // 방문 못한 노드 찾기
        for (int node = 1; node < n + 1; node++) {
          if (!costs.containsKey(node)) {
            return -1;
          }
        }
        // 최소값중에서 최대값 구하기
        return costs.values().stream()
        .mapToInt(Integer::intValue).max().getAsInt();
      }
    
      public static void main(String[] args) {
        NetworkDelayTime solution = new NetworkDelayTime();
        int[][] times = {
          {2, 1, 2},
          {2, 3, 5},
          {2, 4, 1},
          {4, 3, 3}
        };
        int result = solution.solution(times, 4, 2);
        System.out.println(result);
      }
    }

    이렇게 구현하니 제대로 돌아가서 문의드립니다

답변 2

1

개발남노씨님의 프로필 이미지
개발남노씨
지식공유자

엇 라뗴님 감사합니다. 원본 코드의 버그가 맞아요!!

 

  1. e1[0] - e2[0] 이게 맞습니다.

  2. int nextCost = curCost + edge[2]; // edge[2]가 가중치 이게 맞아요!!

  3. {cost, node} 이것도 지적해주신게 맞습니다!! 코드가 여기저기서 엉켰네요

라떼님이 수정해주신 코드가 올바른 다익스트라 구현입니다. 강의 코드 를 수정하도록 하겠습니다. 🙂 지적해주셔서 감사합니다~~!

0

안녕하세요, 인프런 AI 인턴입니다.
라뗴님께서 질문하신 다익스트라 알고리즘에 대한 Network Delay Time 문제에 대해 설명드리겠습니다.

  1. 우선순위 큐에서의 정렬: 우선순위 큐의 비교 기준이 e1[2] - e2[2]로 되어있다면, 이는 3번째 요소를 기준으로 정렬하라는 의미일 것입니다. 하지만 이 경우 배열의 경계값을 벗어난 접근을 시도하였기에 IndexOutOfBoundsException이 발생할 수 있습니다. 문제 의도에 맞게 코드를 변경하려면 e1[0] - e2[0]으로 수정하여 첫 번째 요소인 비용을 기준으로 정렬해야 합니다.

  2. 다음 노드로의 비용 계산: curCost + edge[0] 부분은 가중치가 아니라 출발 노드를 참조하므로 이 부분은 edge[2]로 수정하여 올바른 가중치를 더해야 합니다.

  3. 우선순위 큐에 넣는 배열: {curNode, nextCost}라는 배열이 new int[]{nextCost, edge[1]}이 맞습니다. 이때 배열의 순서를 {nextCost, edge[1]}로 설정하시어 다음 노드와 비용 정보를 올바르게 큐에 추가하십시오.

이와 같은 방법으로 수정을 하신 코드는 다익스트라 알고리즘이 의도한 바대로 동작할 것입니다. 다익스트라 알고리즘은 그래프에서 특정 노드로부터 다른 모든 노드까지의 최단 경로를 구하는 알고리즘으로, 우선순위 큐를 활용하여 가장 적은 비용부터 탐색을 진행하는 방식으로 동작합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

라뗴님의 프로필 이미지
라뗴

작성한 질문수

질문하기