꾸물꾸물 졔의 개발공부

[백준] 1068 트리 - JAVA 본문

알고리즘/백준

[백준] 1068 트리 - JAVA

체제 2023. 9. 4. 12:03

https://www.acmicpc.net/problem/1068

 

1068번: 트리

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

www.acmicpc.net

 

 

[풀이]

  • DFS 탐색 
  • 인접리스트에 각 노드의 자식 노드(들) 저장, 1차원 정수배열에 각 노드의 부모 노드를 저장한다. 
  • 지워질 노드(erase)가 주어지면, 
    1. erase의 자식 노드를 모두 삭제한다. (erase 리스트를 비운다.) 
    2. erase의 부모 노드 리스트에서 erase를 삭제한다. 
  • 만약 지운 노드가 루트노드라면 0 출력 후 종료. 
  • 그렇지 않다면 루트노드에서 시작하여 DFS 탐색을 시작한다. 탐색 중 노드의 자식 갯수가 0개라면 리프노드 ++ 

 

[구현 과정]

  • List<ArrayList<Integer>> child : 각 노드의 자식 노드(들)을 리스트로 저장 
  • int[] parent : 각 노드의 부모 노드 저장 
  • int erase : 지울 노드 
  • int root : 루트 노드 
  • int cnt : 리프 노드의 갯수 

 

1. 주어진 입력값에 따라 parent 배열에 각 노드의 부모 노드를 저장하고 child 리스트에 각 노드의 자식 노드들을 저장한다. (부모가 -1이라면 해당 노드는 root 노드이다.)

 

2. 지울 노드 erase를 입력받고, 만약 erase 가 -1이라면 루트노드를 지우는 것이므로 0 출력 후 종료 한다. 

 

3. 그렇지 않다면 erase 의 부모노드에서 erase를 찾아(indexOf(erase)) 지우고, erase의 자식 노드를 모두 삭제한다.  

💡erase의 부모노드 : parent[erase] 
💡erase의 부모노드의 자식노드(들) 리스트 : child.get(parent[erase]) 
💡erase의 자식 노드(들) 리스트 : child.get(erase) 

 

 

4. root 노드에서 DFS 탐색을 시작하여, 만약 탐색하는 노드의 자식 노드 갯수가 0일 경우 cnt ++ 

 

5. DFS 탐색 종료 후, cnt 을 출력. 

 


 

[소스 코드]

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

public class Main {
	static List<ArrayList<Integer>> child = new ArrayList<>(); // 자식 노드 저장 
	static int root; //루트 노드 
	static int erase;
	static int cnt=0;
	static int parent[]; 
    
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
		StringTokenizer st; 
		
		int N= Integer.parseInt(br.readLine()); //노드의 갯수 
		for(int i=0; i<N; i++) child.add(new ArrayList<>()); 
		parent = new int [N]; 
		
		st= new StringTokenizer(br.readLine()); 
		for(int i=0; i<N; i++) {
			int p = Integer.parseInt(st.nextToken()); //현재 i노드의 부모 
			parent[i] = p; 
			if(p == -1) {
				root = i; //루트노드 
				continue;
			}
			child.get(p).add(i); 
		}
		
		erase= Integer.parseInt(br.readLine()); //지울 노드 
		if(parent[erase] == -1) {
			System.out.println(0);
			return; 
		}
		child.get(parent[erase]).remove(child.get(parent[erase]).indexOf(erase)); 
		child.get(erase).clear(); 
		
		dfs(root);
		System.out.println(cnt);
	}//end of main
	
	private static void dfs(int node) {
		if(child.get(node).size() == 0) {
			cnt++;
			return; 
		}
		else {
			for(int next: child.get(node)) {
				dfs(next);		
			}
		}
	}
}//end of class

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

[백준] 12904 A와 B - JAVA  (0) 2023.09.06
[백준] 17471 게리맨더링 - JAVA  (0) 2023.09.05
[백준] 2294 동전 2 - JAVA  (0) 2023.09.01
[백준] 1806 부분합 - JAVA  (0) 2023.08.30
[백준] 2638 치즈 - JAVA  (0) 2023.08.29