[Algorithm] 백준_트리의 지름_1167번 (JAVA)

2025. 3. 1. 00:13·Algorithm

📝문제

 

💡풀이

예제의 입력을 그림으로 표현하면 아래와 같다.

각 정점에 대해 가장 긴 거리 경로를 구하면

1-3-4-5 :11

2-4-3-1 :9

3-4-5 :9

4-5 :6 

5-4-3-1 :11

 

위 결과의 공통 점은 1또는 5가 경로에 포함 된다는 것이다.

트리의 지름은 1에서 5의 거리인데

 

어떤 정점에서 구해도 1또는 5를 포함해야 가장 긴 경로가 나온다.

 

이러한 결과로 이 문제의 아이디어는 다음과 같이 구할 수 있다.

1. 임의의 정점에서 가장 긴 거리의 정점을 찾는다. 

2. 1에서 찾은 정점을 기준으로 한번 더 가장 긴 거리의 정점을 찾는다.

 

dfs를 두번 호출하여 정답을 구할 수 있다.

 

전체풀이

import java.util.*;
import java.io.*;
class Main{
    static boolean[] visited;
    static int V,diameter;
    static ArrayList<Integer>[] tree;
    static int farthestLen;
    static int farthestV;
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        V = Integer.parseInt(br.readLine());
        tree = new ArrayList[V+1];

        for(int i = 0; i <= V; i++){
            tree[i] = new ArrayList<>();
        }
        for(int i = 0; i < V; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            int n = Integer.parseInt(st.nextToken());//정점 번호
            int m;
            while((m = Integer.parseInt(st.nextToken())) != -1){
                int distance = Integer.parseInt(st.nextToken());
                tree[n].add(m);
                tree[n].add(distance);
            }
        }

        visited = new boolean[V+1];
        visited[1] = true;
        dfs(1, 0);//1과 가장 먼 정점을 찾는다.

        visited = new boolean[V+1];
        visited[farthestV] = true;
        dfs(farthestV, 0);

        System.out.println(farthestLen);
    }
    public static void dfs(int n, int len){
        if(farthestLen < len){
            farthestV = n;
            farthestLen = len;
        }

        for(int i = 0; i < tree[n].size(); i+=2){
            int v = tree[n].get(i); //연결된 정점
            int d = tree[n].get(i+1); //거리
            if(!visited[v]){
                visited[v] = true;
                dfs(v, len+d);
            }
        }
    }
}

 

🤔Review

처음에 전체를 검색하여 시간초과가 났었는데 
https://moonsbeen.tistory.com/101 이 블로그를 참고하여 이 문제를 이해할 수 있었다🫠 낯설고..어렵다..

'Algorithm' 카테고리의 다른 글

[Algorithm] 백준_토마토_7569번 (JAVA) 🍅  (0) 2025.03.18
[Algorithm] 백준_대회 or 인턴_2875번 (JAVA)  (0) 2025.03.04
[Algorithm] 백준_다리 만들기_2164번 (JAVA)  (0) 2025.02.27
[Algorithm] 99클럽 코테 스터디 25일차 TIL | 백준_무한 수열(1351번)  (0) 2025.02.21
[Algorithm] 99클럽 코테 스터디 24일차 TIL | 백준_합분해(2225번)  (0) 2025.02.20
'Algorithm' 카테고리의 다른 글
  • [Algorithm] 백준_토마토_7569번 (JAVA) 🍅
  • [Algorithm] 백준_대회 or 인턴_2875번 (JAVA)
  • [Algorithm] 백준_다리 만들기_2164번 (JAVA)
  • [Algorithm] 99클럽 코테 스터디 25일차 TIL | 백준_무한 수열(1351번)
dev_ajrqkq
dev_ajrqkq
알고리즘 천재가 될 거야
  • dev_ajrqkq
    기록이 자산이다
    dev_ajrqkq
  • 전체
    오늘
    어제
    • 분류 전체보기 (149) N
      • Front-end (0)
      • Back-end (4) N
        • Spring (1)
        • Java (8)
      • CS (9)
        • 데이터베이스 (5)
        • 네트워크 (4)
      • Algorithm (80)
      • 이것저것 (0)
      • 버그잡기 (1)
      • TIL (37)
      • 후기 (1)
      • 취준 (0)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      코딩테스트준비
      개발자취업
      티스토리챌린지
      Til
      오블완
      99클럽
      TypeScript
      항해99
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.2
    dev_ajrqkq
    [Algorithm] 백준_트리의 지름_1167번 (JAVA)
    상단으로

    티스토리툴바