[문제링크]

 

1967번: 트리의 지름

파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연

www.acmicpc.net

 

0. 트리의 차수가 2 이상 커지지 않는다는 글이 있지만, 2 이상의 자식도 가정하고 작성

  - 관련글 (링크)

 

1. A노드가 root인 트리의 지름은?

  - 자식 노드 B,C,D가 있을 때, 각 자식 트리의 최대 깊이들 중 1, 2순위의 합이다

 

2. 자식 서브트리의 최대 깊이는? 재귀를 통해 최대 깊이만 반환토록 해 구한다

  - 자식이 없으면 0을 반환

  - 자식의 최대 깊이 + root로부터의 cost = 최대 깊이

 

3. 자식들을 순회하며 길이를 구하고, 1위와 2위를 구한 후 1+2의 결과로 지름을 갱신

  - 1순위만을 반환해 부모 트리의 연산에 이용한다

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main{
	public static void main(String[] args)throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = pint(br.readLine());
		graph = new ArrayList<>();
		for (int i = 0; i <= N; i++) {
			graph.add(new ArrayList<>());
		}
		
		for (int i = 0; i < N-1; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
			int n = pint(st.nextToken());
			int m = pint(st.nextToken());
			int c = pint(st.nextToken());
			
			graph.get(n).add(new int[] {m,c});
		}
		
		rec(1);
		System.out.println(max);
	}
	static int max=0;
	static ArrayList<ArrayList<int[]>>graph;
	
	static int rec(int node) {
		int fstMin=0, sndMin=0;
		
		for (int i = 0; i < graph.get(node).size(); i++) {
			int[] cur = graph.get(node).get(i);
			
			int temp = cur[1] + rec(cur[0]);
			
			if(fstMin<temp) {
				sndMin=fstMin;
				fstMin=temp;
			}
			else if(sndMin<temp) {
				sndMin=temp;
			}
		}
		max=Math.max(max, fstMin+sndMin);
		return fstMin;
	}
	
	static int pint(String s) {
		return Integer.parseInt(s);
	}
}

결과 화면

 

'알고리즘 문제 풀이 > BOJ 골드' 카테고리의 다른 글

[백준] 1081 - 합  (0) 2021.04.20
[백준] 1167 - 트리의 지름  (0) 2021.04.18
[백준] 1238 - 파티  (0) 2021.04.18
[백준] 2263 - 트리의 순회  (0) 2021.04.16
[백준] 17471 - 게리맨더링  (0) 2021.04.16
[백준] 4056 - 스-스-스도쿠  (0) 2021.04.16
[백준] 2239 - 스도쿠  (0) 2021.04.16

+ Recent posts