투로드
Coder ToLoad
투로드
전체 방문자
오늘
어제

블로그 메뉴

  • 홈
  • 알고리즘
  • CS
  • GITHUB
  • 태그
  • 분류 전체보기 (69)
    • Toy Project (0)
      • EternalSNS (0)
    • Algorithm (46)
      • BaekJoon (38)
      • Programmers (7)
      • Code Tree (1)
    • Computer Science (13)
      • JAVA (7)
      • DataBase (4)
    • Backend (7)
      • Spring (2)
      • JPA (2)
      • Django (3)
    • Mobile (2)
      • Android (2)
    • Unity (1)

인기 글

최근 글

hELLO · Designed By 정상우.
투로드

Coder ToLoad

Algorithm/BaekJoon

[JAVA] 백준 1068 : 트리

2021. 3. 22. 15:50
문제
 

1068번: 트리

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

www.acmicpc.net

 

해결 방법

인접리스트를 활용해서 트리를 구현한 다음

리프노드를 체크해서 개수를 출력하였다.

 

리프노드(Leaf Node)란?

자식 노드가 없는 노드를 잎 노드(leaf node 리프 노드) 라고 한다.

출처 : ko.wikipedia.org/wiki/%ED%8A%B8%EB%A6%AC_%EA%B5%AC%EC%A1%B0

 

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

public class Main {
	static ArrayList<Integer> list[];
	static boolean visit[];
	static int leafCnt = 0;
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		list = new ArrayList[N];
		visit = new boolean[N];
		
		for (int i = 0; i < N; i++) {
			list[i] = new ArrayList<>();
		}
		
		int root = 0;
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		for (int i = 0; i < N; i++) {
			int temp = Integer.parseInt(st.nextToken());
			if (temp == -1) { // -1 일 경우는 루트노드.
				root = i;
			} else {
				list[i].add(temp); // 양방향으로 인접리스트를 추가한다.
				list[temp].add(i);
			}
		}
		
		int delNode = Integer.parseInt(br.readLine());
		if (delNode == root) { // 루트노드를 삭제하면 트리가 사라지기 때문에 0을 출력.
			System.out.println(0);
			return;
		}
		visit[delNode] = true; // 지울 노드는 이미 방문했다고 입력함으로써 처리.
		
		dfs(root);
		System.out.println(leafCnt);
	}
	
	static void dfs(int root) {
		boolean isLeaf = true; // 리프노드인지 아닌지 확인용.
		visit[root] = true;
		
		for (int i = 0; i < list[root].size(); i++) {
			if (visit[list[root].get(i)] == false) {
				isLeaf = false; // 추가로 탐색해야하는 부분이 있으면 리프노드가 아님.
				dfs(list[root].get(i));
			}
		}
		
		if (isLeaf) { // 반복문이 끝나고 추가 탐색이 일어나지 않았으면 리프노드.
			leafCnt++;
		}
	}
}

'Algorithm > BaekJoon' 카테고리의 다른 글

[JAVA] 백준 2776 : 암기왕  (0) 2021.03.25
[JAVA] 백준 1620 : 나는야 포켓몬 마스터 이다솜  (0) 2021.03.24
[JAVA] 백준 14267 : 회사 문화 1  (0) 2021.03.24
[JAVA] 백준 15900 : 나무 탈출  (0) 2021.03.23
[JAVA] 백준 1774번 : 우주신과의 교감  (0) 2021.03.09
    'Algorithm/BaekJoon' 카테고리의 다른 글
    • [JAVA] 백준 1620 : 나는야 포켓몬 마스터 이다솜
    • [JAVA] 백준 14267 : 회사 문화 1
    • [JAVA] 백준 15900 : 나무 탈출
    • [JAVA] 백준 1774번 : 우주신과의 교감
    투로드
    투로드
    훌륭한 프로그래머가 되어가는 과정을 담아보는 중입니다.

    티스토리툴바