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

2025. 5. 4. 03:25·알고리즘/문제풀이

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

 

문제

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
저작자표시 비영리 변경금지 (새창열림)
'알고리즘/문제풀이' 카테고리의 다른 글
  • [프로그래머스] 11053 N개의 최소공배수 - JAVA
  • [프로그래머스] 86971 전력망을 둘로 나누기 - JAVA - Lv2
  • [백준/BOJ] 1149 RGB거리 - JAVA - 실버1
  • [백준/BOJ] 12946 하노이의 탑 - JAVA - Lv2
LIRI
LIRI
  • LIRI
    기록
    LIRI
  • 전체
    오늘
    어제
    • 분류 전체보기 (74)
      • 블로그 꾸미기 (0)
      • Spring (6)
      • 바이브코딩 (1)
      • React (3)
      • CS (0)
      • 알고리즘 (57)
        • 개념 (2)
        • 문제풀이 (54)
      • Java (1)
      • DB (1)
      • log (4)
        • SSAFY (3)
        • 궁금 (1)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 공지사항

  • 인기 글

  • 태그

    비트마스킹
    Java
    Security
    LV2
    BFS
    dp
    프로그래머스
    Springsecurity
    lv3
    dfs
    느좋코딩
    pccp모의고사
    알고리즘 문제풀이
    springboot
    백준
    JWT
    너비우선탐색
    최장증가부분수열
    알고리즘
    리액트
    바이브코딩
    SSAFY 9기
    그리디
    ssafy 합격 후기
    싸피
    LIS
    Spring
    BOJ
    SSAFY
    커서ai
  • 최근 댓글

  • 최근 글

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

티스토리툴바