[백준/BOJ] 1240 노드사이의 거리 - JAVA - 골드5

2025. 5. 4. 03:25·알고리즘/문제풀이
728x90
반응형

[백준/BOJ] 1240 노드사이의 거리 - JAVA - 골드5

문제

https://www.acmicpc.net/problem/1240

문제 분석

조건

  • 노드 N개로 구성된 트리(간선 N-1개)가 주어진다.
  • 각 간선에는 거리(가중치)가 있다.
  • M개의 쿼리가 주어지고, 각 쿼리마다 두 노드 사이의 거리를 출력해야 한다.

풀이방법

  • 트리에서 두 노드 사이의 경로는 항상 유일하다.
  • 따라서 각 쿼리에 대해 DFS나 BFS로 시작 노드부터 도착 노드까지의 경로를 찾아, 누적 거리만 계산하면 된다.

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    static List<Integer>[] tree;
    static int[][] dist;
    static boolean[] visited;
    static int answer;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();

        st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        tree = new ArrayList[N + 1];
        dist = new int[N + 1][N + 1];
        for (int i = 1; i <= N; i++) {
            tree[i] = new ArrayList<>();
        }
        for (int i = 0; i < N - 1; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            int distance = Integer.parseInt(st.nextToken());
            tree[a].add(b);
            tree[b].add(a);
            dist[a][b] = distance;
            dist[b][a] = distance;
        }
        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            int start = Integer.parseInt(st.nextToken());
            int end = Integer.parseInt(st.nextToken());
            visited = new boolean[N + 1];
            visited[start] = true;
            answer = 0;
            dfs(start, end, 0);
            System.out.println(answer);
        }
    }

    private static void dfs(int now, int find, int count) {
        if (now == find) {
            answer = count;
            return;
        }
        for (Integer next : tree[now]) {
            if (!visited[next]) {
                visited[next] = true;
                dfs(next, find, count + dist[now][next]);
            }
        }
    }
}

결과

728x90
반응형
저작자표시 비영리 변경금지
'알고리즘/문제풀이' 카테고리의 다른 글
  • [프로그래머스] 86971 전력망을 둘로 나누기 - JAVA - Lv2
  • [백준/BOJ] 1149 RGB거리 - JAVA - 실버1
  • [백준/BOJ] 12946 하노이의 탑 - JAVA - Lv2
  • [프로그래머스] 92343 양과 늑대 - JAVA - Lv3
LIRI
LIRI
  • LIRI
    기록
    LIRI
  • 전체
    오늘
    어제
    • 분류 전체보기 (38)
      • 블로그 꾸미기 (0)
      • Spring (6)
      • React (3)
      • CS (0)
      • 알고리즘 (22)
        • 개념 (2)
        • 문제풀이 (19)
      • Java (1)
      • DB (1)
      • log (4)
        • SSAFY (3)
        • 궁금 (1)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준
    불 끄기
    LV2
    알고리즘
    SSAFY 9기
    Java
    골드1
    SSAFY 스터디
    싸피
    dfs
    그리디
    lv3
    ssafy 합격 후기
    pccp모의고사
    너비우선탐색
    리액트
    SSAFY
    JWT
    비트마스킹
    Springsecurity
    dp
    BFS
    springboot
    최장증가부분수열
    프로그래머스
    Security
    BOJ
    LIS
    Spring
    도대체왜
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
LIRI
[백준/BOJ] 1240 노드사이의 거리 - JAVA - 골드5
상단으로

티스토리툴바