[백준 1068] 트리(JAVA)

Ji Hoon Byun·2022년 2월 8일
0
post-thumbnail

링크

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

문제 설명

문제

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

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

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

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

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

문제 풀이

  1. 인덱스와 자식리스트를 가진 클래스 Node를 생성한다.
  2. N개 만큼의 nodes배열을 만든다.
  3. 입력이 들어오는 노드들의 부모에 노드를 연결해 트리를 만든다.
  4. deleteNode 메서드를 재귀적으로 돌며 삭제할 노드(D)를 삭제해준다.
  5. dfs 메서드를 재귀적으로 돌며 자식이 없는 노드를 만날 경우(leaf Node) ans를 1씩 증가 시킨다.
  6. ans 출력

주의할 점

  • 이진 트리가 아님(문제에 명시되어있지 않음으로)

소스코드

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

public class Baek_1068_트리 {
	static int N, D, ans = 0;
	static Node[] nodes;

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;

		N = Integer.parseInt(br.readLine());
		nodes = new Node[N + 1];

		st = new StringTokenizer(br.readLine());

		for (int i = 0; i <= N; i++) {
			nodes[i] = new Node(i);
		}

		int root = 0;
		for (int i = 0; i < N; i++) {
			int parent = Integer.parseInt(st.nextToken());

			if (parent == -1) {
				root = i;
				continue;
			}

			nodes[parent].child.add(nodes[i]);
		}
		D = Integer.parseInt(br.readLine());
		
		if (D != root) {
			deleteNode(root);
			dfs(root);
		}
		System.out.println(ans);
	}

	static void deleteNode(int idx) {
		for(Node child : nodes[idx].child) {
			if(child.idx == D) {
				nodes[idx].child.remove(child);
				return;
			}
			deleteNode(child.idx);
		}
	}

	static void dfs(int idx) {
		if (nodes[idx].child.size() == 0) {
			ans++;
			return;
		}
		
		for(Node child : nodes[idx].child) {
			dfs(child.idx);
		}
	}

	static class Node {
		int idx;
		ArrayList<Node> child = new ArrayList<>();

		public Node(int idx) {
			this.idx = idx;
		}
	}
}

GITHUB

https://github.com/hoonze/SSAFY_Algorithm_Study/tree/master/SSAFYT_Study/etc/2022.02/Baek_1068_%ED%8A%B8%EB%A6%AC

profile
안녕하세요, 백엔드 개발에 관심이 많은 변지훈입니다.👋

0개의 댓글