[실전 문제] 트리의 높이
2021. 2. 22. 17:03ㆍ코딩 테스트/실전 문제
1. 문제
트리의 높이는 루트로부터 가장 멀리 떨어진 노드와의 거리로 정의된다. 예를 들어, 아래의 트리에서 0번 노드가 루트라고 하면, 7번 노드까지의 거리가 가장 멀고, 그 거리는 3이다. 따라서 이 트리의 높이는 3이 된다.

트리가 주어질 때, 그 트리의 높이를 출력하는 프로그램을 작성하시오.
입력
첫 번째 줄에 트리의 노드 개수 n, 그리고 루트노드의 번호 r이 주어진다. ( 1 ≤ n ≤ 100, 0 ≤ r ≤ n - 1 ) 두 번째 줄부터 트리의 간선 정보가 주어진다. 각 줄은 2개의 숫자 a, b로 이루어지며, 이는 a번 노드와 b번 노드가 연결되어 있다는 뜻이다. 각 노드의 번호는 0 ~ n-1까지 존재한다. 또한, 연결이 되지않은 노드는 없다.
출력
트리의 높이를 출력한다.
예제 입력
8 0
0 1
0 2
1 3
1 4
1 5
2 6
6 7
예제 출력
3
2. 풀이
이 문제의 해결법은 DFS이다. 단, 방문하면서 그 때의 높이를 저장하여 해결해야한다. 이 문제의 해결법은 간단하다.
코드상에서 visitedHeight는 방문 여부와 높이를 처리하는 변수로, '-1' 일 경우 방문을 안했음을 뜻하고, 그 이외의 값들은 각 노드에서의 높이 정보를 뜻한다.
이 visitedHeight를 이용하여 가장 큰 값이 트리에서의 최대 높이임을 뜻한다.
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
class Graph {
private ArrayList<ArrayList<Integer>> graph;
public Graph(int nodeSize) {
graph = new ArrayList<>();
for(int i = 0; i < nodeSize + 1; i++) {
graph.add(new ArrayList<>());
}
}
public void put(int n, int m) {
graph.get(n).add(m);
graph.get(m).add(n);
}
public ArrayList<Integer> getNode(int n) {
return graph.get(n);
}
}
public class Main {
private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
private static int node;
private static int rootNum;
private static Graph graph;
private static int[] visitedHeight;
public static void main(String[] args) throws IOException {
StringTokenizer st = new StringTokenizer(br.readLine());
node = Integer.parseInt(st.nextToken());
rootNum = Integer.parseInt(st.nextToken());
graph = new Graph(node);
visitedHeight = new int[node];
Arrays.fill(visitedHeight, -1);
for(int i = 0; i < node-1; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
graph.put(a, b);
}
dfs(rootNum, 0);
int max = -987987987;
for(int i = 0; i < node; i++) {
if(max < visitedHeight[i]) max = visitedHeight[i];
}
bw.write(max + " ");
br.close();
bw.flush();
bw.close();
}
private static void dfs(int v, int height) {
visitedHeight[v] = height;
for(int i = 0; i < graph.getNode(v).size(); i++) {
int w = graph.getNode(v).get(i);
if(visitedHeight[w] == -1) {
dfs(w, height+1);
}
}
}
}
728x90
'코딩 테스트 > 실전 문제' 카테고리의 다른 글
[실전 문제] 직사각형의 합 (0) | 2021.02.22 |
---|---|
[실전 문제] 트리에서의 거리 (0) | 2021.02.22 |
[실전 문제] 탑 (0) | 2021.02.22 |
[실전 문제] 구간의 합집합 (0) | 2021.02.22 |