백준 - 1967번 - 트리의 지름

이상훈·2023년 5월 3일
0

1967번

import java.util.*;
import java.io.*;

public class Main{
	static ArrayList<Node>[] al;
	static boolean[] visited;
	static int node;
	static int max = 0;

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(bf.readLine());

		if(n == 1) {
			System.out.println(0);
		}
		else {
			al = new ArrayList[n + 1];
			for (int i = 1; i < n + 1; i++) {
				al[i] = new ArrayList<>();
			}

			for (int i = 0; i < n - 1; i++) {
				StringTokenizer st = new StringTokenizer(bf.readLine());
				int p = Integer.parseInt(st.nextToken());
				int c = Integer.parseInt(st.nextToken());
				int v = Integer.parseInt(st.nextToken());
				al[p].add(new Node(c, v));
				al[c].add(new Node(p, v));
			}

			visited = new boolean[n + 1];
			dfs(1, 0);

			visited = new boolean[n + 1];
			dfs(node, 0);

			System.out.println(max);
		}
	}

	public static void dfs(int a, int len) {
		if (max < len) {
			max = len;
			node = a;
		}

		visited[a] = true;

		for (int i = 0; i<al[a].size(); i++) {
			Node n = al[a].get(i);
			if (!visited[n.x]) {
				dfs(n.x, n.cost + len);
			}
		}
	}

	public static class Node {
		int x, cost;
		public Node(int x, int cost) {
			this.x = x;
			this.cost = cost;
		}
	}
}

풀이


트리의 지름을 구하는 문제다.

저번에 이 유형을 풀어봐서 dfs를 두번 돌려버렸다.

그런데 문제 예제도 잘 나오고 하는데 정답제출하니까 nullpoint예외가 나왔다. 이게 나올리가 없는데 계속해서 생각했는데 다른 분들걸 봤더니 문제에 노드의 개수 n(1 ≤ n ≤ 10,000)를 이따구로 정의해놨다.

n이 입력되면 두번재줄부터 n-1개의 연결식이 나오는데 n이 1이면 당연히 연결식도 없다... 그래서 al[1]이 선언은 됐는데 .size()가 null나온다.

그래서 n==1일때 예외처리를 해줬고 잘 풀렸다...

앞으로 이런부분은 좀 치사하다 생각하지만...다음부터 잘 봐야겠다.

0개의 댓글