[백준] 1068 트리.java

전영서·2021년 10월 17일
0

Algorithm

목록 보기
79/89

1.문제

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

2.코드

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

public class Main {
	//child를 저장할 객체
	public static class Node{
		ArrayList<Integer> child = new ArrayList<Integer>();

		public Node(int num) {
			super();
			child.add(num);
		}
	}

	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    //노드의 개수
		int N = Integer.parseInt(br.readLine());
		//노드 선언
		Node[] tree = new Node[N];
    //초기화
		for(int i=0; i<N; i++) {
			tree[i] = null;
		}
    
		StringTokenizer st = new StringTokenizer(br.readLine());
		int start = 0;
    //입력받아서 자식으로 넣어준다
		for (int i = 0; i < N; i++) {
			int parent = Integer.parseInt(st.nextToken());
      //-1은 시작값(루트)
			if (parent == -1) {
				start = i;
				continue;
			}
			//null이면 객체 만들어서 넣어주고 아니면 뒤에 추가해준다.
			if(tree[parent]!=null) {
				tree[parent].child.add(i);
			}else {
				tree[parent] = new Node(i);
			}
		}
		//제거할 노드 : 가지않을거다
		int remove = Integer.parseInt(br.readLine()); 
		
		System.out.println(dfs(tree, start, remove));
		
		
	}
  //객체 리스트, 현재 노드 넘버, remove된 넘버
	private static int dfs(Node[] tree, int number, int pass) {
  //삭제된 노드에 들어왔다는것이므로 0을 리턴
		if(number == pass) return 0;
		// 자식이 없으므로 말단 노드 이다. 1을 리턴해준다.
		if(tree[number] == null) {
			return 1;
		}
		//노드의 자식이 1개였는데 삭제되었으므로 1을 리턴
		if(tree[number].child.size()==1) {
			if(tree[number].child.get(0)==pass) {
				return 1;
			}
		}
		//리턴 할 변수
		int result = 0;
		//각각의 노드에 접근
		for(int next : tree[number].child) {
			result += dfs(tree, next, pass);
		}
		
		return result;
		
	}
}

3.Review

child를 가지고있는 Node를 만들어서 활용하였다.

입력값은 부모로 생각하여 받아주었다.

설명은 주석으로 써놧으니 코드와 같이 읽으면 될겁니다.

profile
꾸준히 성실하게

0개의 댓글