본문 바로가기
알고리즘/백준

[Java] BOJ 1068번 트리

by 컴공맨 2021. 6. 29.
 

1068번: 트리

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

www.acmicpc.net


풀이

DFS를 이용하여 해결했습니다.

코드 주석을 참고해주세요.


코드

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

public class Main {
	public static int N, root, removeNode, answer;
	public static boolean[] visited;
	public static List<Integer>[] tree;
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		
		N = Integer.parseInt(br.readLine());
		
		visited = new boolean[N];
		
		// 이 문제에서의 트리는 이진트리가 아님을 주의
		// 즉, 한 노드의 자식으로 2개 이상의 노드가 주어질 수도 있다.
		tree = new ArrayList[N];
		
		for (int i = 0; i < N; ++i) {
			tree[i] = new ArrayList<Integer>();
		}
		
		st = new StringTokenizer(br.readLine(), " ");
		for (int i = 0; i < N; ++i) {
			int node = Integer.parseInt(st.nextToken());
			
			if (node != -1) {
				tree[i].add(node);
				tree[node].add(i);
			}
			else {
				root = i;
			}
		}
		
		removeNode = Integer.parseInt(br.readLine());
		// 지우고자하는 노드를 미리 방문처리해서 DFS를 하지 못하게 한다.
		visited[removeNode] = true;
		
		// 루트노드가 지워지면 리프노드의 개수는 0이되므로 이를 처리하기 위함
		if (!visited[root]) {
			go(root);
		}
		
		System.out.println(answer);
	}
	
	public static void go(int node) {
		// 현재 노드를 방문 처리
		visited[node] = true;
		
		int childCnt = 0;
		for (int i = 0; i < tree[node].size(); ++i) {
			int nextNode = tree[node].get(i);
			
			// ArrayList에 예를 들어 -1 0 0 1 1 이라면
			// 0 : 1, 2
			// 1 : 0, 3, 4
			// 2 : 0
			// 3 : 1
			// 4 : 1
			// 처럼 저장되지만 1번 인덱스의 경우 0번은 부모노드인데 이때,
			// 부모노드인 경우 visited가 이미 true가 되어있으므로 방문을 다시 안하고
			// 자식노드만 방문하게 된다.
			if (!visited[nextNode]) {
				childCnt++;
				visited[nextNode] = true;
				go(nextNode);
			}
		}
		
		// 자식 노드가 없다면 이는 리프노드이므로
		if (childCnt == 0) {
			answer++;
		}
	}
}

 

pyo7410/Algorithm

1일 1커밋을 목표로! Contribute to pyo7410/Algorithm development by creating an account on GitHub.

github.com

 

'알고리즘 > 백준' 카테고리의 다른 글

[Java] BOJ 11559번 Puyo Puyo  (0) 2021.07.01
[Java] BOJ 2636번 치즈  (0) 2021.06.30
[Java] BOJ 13549번 숨바꼭질 3  (0) 2021.06.28
[Java] BOJ 9252번 LCS2  (0) 2021.06.25
[Java] BOJ 9019번 DSLR  (0) 2021.06.24