https://www.acmicpc.net/problem/1068
1068번: 트리
첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다
www.acmicpc.net
상당히 헷갈리는 문제였습니다.
그래프를 만들어서 진행했습니다.
기억해야할점들입니다.
첫번째, 삭제 처리된 노드를 dfs가 들어가기 전에 먼저 처리해야합니다.
이렇게 처리해야만 dfs가 삭제된 노드를 아예 없다고 인식하여 리프노드로 인식됩니다.
두번째, 삭제 노드delete는 무조건 0번 노드가 아닙니다.
그러므로 루트노드의 번호 비교해야합니다.
if(delete == root.index) { System.out.println(answer); return ; }
코드입니다.
import java.util.ArrayList; import java.util.Scanner; public class Main { static ArrayList<ArrayList<Node>> graph = new ArrayList<ArrayList<Node>>(); static Node root; static int answer=0; static int delete=0; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); for(int i=0;i<N;i++) { graph.add(new ArrayList<Node>()); } for(int i=0;i<N;i++) { int parent = sc.nextInt(); if(parent == -1) {root = new Node(i); } else graph.get(parent).add(new Node(i)); } delete = sc.nextInt(); if(delete == root.index) { System.out.println(answer); return ; } for(int i=0;i<graph.size();i++) { for(int j=0;j<graph.get(i).size();j++) { if(graph.get(i).get(j).index == delete) { graph.get(i).remove(j); } } } dfs(root); System.out.println(answer); } static void dfs(Node start) { if(start == null) return; if(graph.get(start.index).size() == 0) answer++; for(int i=0;i<graph.get(start.index).size();i++) { dfs(graph.get(start.index).get(i)); } } static class Node{ int index; public Node(int index) { this.index = index; } } }
'알고리즘 > Tree' 카테고리의 다른 글
[백준] 1967 트리의 지름 - 골드4, DFS + 트리(Tree) 자바 (0) | 2023.01.13 |
---|---|
[백준] 나무 위의 빗물 - 골드5, 트리(Tree) (0) | 2023.01.12 |
[백준] 단절점과 단절선 - 실버1, 트리(Tree) (0) | 2023.01.12 |
[백준] 1991 트리 순회 - 실버1, 트리(Tree) + DFS (0) | 2023.01.11 |
[백준] 11725 트리의 부모 찾기 - 트리(Tree) + DFS(깊이우선탐색) JAVA (0) | 2023.01.11 |