1 minute read

트리

시간 제한 메모리 제한
2 초 128 MB

문제

트리에서 리프 노드란, 자식의 개수가 0인 노드를 말한다.

트리가 주어졌을 때, 노드 하나를 지울 것이다. 그 때, 남은 트리에서 리프 노드의 개수를 구하는 프로그램을 작성하시오. 노드를 지우면 그 노드와 노드의 모든 자손이 트리에서 제거된다.

예를 들어, 다음과 같은 트리가 있다고 하자.

https://upload.acmicpc.net/560de878-d961-475e-ada4-e1f0774e5a84/-/preview/

현재 리프 노드의 개수는 3개이다. (초록색 색칠된 노드) 이때, 1번을 지우면, 다음과 같이 변한다. 검정색으로 색칠된 노드가 트리에서 제거된 노드이다.

https://upload.acmicpc.net/d46ddf4e-1b82-44cc-8c90-12f76e5bf88f/-/preview/

이제 리프 노드의 개수는 1개이다.

입력

첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다. 셋째 줄에는 지울 노드의 번호가 주어진다.

출력

첫째 줄에 입력으로 주어진 트리에서 입력으로 주어진 노드를 지웠을 때, 리프 노드의 개수를 출력한다.

예제 입력 1

5
-1 0 0 1 1
2

예제 출력 1

2

예제 입력 2

5
-1 0 0 1 1
1

예제 출력 2

1

예제 입력 3

5
-1 0 0 1 1
0

예제 출력 3

0

예제 입력 4

9
-1 0 0 2 2 4 4 6 6
4

예제 출력 4

2

출처

Idea.

  • 리프 노드를 어떻게 제거하는가?
  • 입력받은 제거할 노드를 만나면 방문하지 않는다.
  • 방문할 노드가 있을 경우 == 자식 노드가 있다 (깊이 탐색이 아직 끝나지 않았다.)
  • 자식 노드가 0인경우 == 리프 노드
package tree;

import java.util.ArrayList;
import java.util.Scanner;

public class P1068_leafNode {
	static ArrayList<Integer>[] tree;
	static boolean[] visited;
	static int deleteNodeNumber;
	static int answer;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int N = sc.nextInt();

		tree = new ArrayList[N];
		visited = new boolean[N];

		for (int i = 0; i < N; i++) {
			tree[i] = new ArrayList<Integer>();
		}

		int rootNode = 0;

		for (int i = 0; i < N; i++) {
			int x = sc.nextInt();
			if (x == -1) {
				rootNode = i;
				continue;
			} else {
				tree[i].add(x);
				tree[x].add(i);
			}
		}

		deleteNodeNumber = sc.nextInt();

		if (deleteNodeNumber == rootNode) {
			System.out.println(0);
		} else {
			dfs(rootNode);
			System.out.println(answer);
		}
	}

	private static void dfs(int node) {
		visited[node] = true;
		int childNode = 0;

		for (int i : tree[node]) {
			if (visited[i] == false && i != deleteNodeNumber) {
				childNode++;
				dfs(i);
			}
		}
		if (childNode == 0) {
			answer++;
		}
	}
}

Leave a comment