반응형
https://www.acmicpc.net/problem/1068
[풀이과정]
노드 삭제 후 그냥 탐색하면 되는데 복잡하게 생각했던 것 같다.
항상 간단하게 생각하는 습관을 들이자
[코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
/*
트리가 주어졌을 때 노드 하나를 지우면
남은 트리에서 리프 노드의 개수를 구하기
리프노드 : 자식의 개수가 0인 노드
*/
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static int N, deleteNode, rootNode, result;
static ArrayList<Integer>[] graph;
static boolean[] visited;
static int[] parent;
public static void main(String[] args) throws IOException{
init();
/*
[출력]
리프노드의 개수
*/
//만약 루트노드를 삭제하면
if(deleteNode == rootNode){
System.out.println(0);
}
else{
DFS(rootNode);
System.out.println(result);
}
}
static void init() throws IOException {
/*
[입력]
1. 노드의 개수 N (1 <= N <= 50)
2.각 노드의 부모, 루트면 -1
3. 지울 노드의 번호
*/
N = Integer.parseInt(br.readLine());
graph = new ArrayList[N + 1];
visited = new boolean[N + 1];
parent = new int[N + 1];
for(int n = 0; n < N; n++){
graph[n] = new ArrayList<>();
}
st = new StringTokenizer(br.readLine());
for(int n = 0; n < N; n++){
int parentNode = Integer.parseInt(st.nextToken());
//루트 노드 번호 찾기
if(parentNode == -1){
rootNode = n;
}else{
graph[n].add(parentNode);
graph[parentNode].add(n);
}
}
deleteNode = Integer.parseInt(br.readLine());
result = 0;
}
static void DFS(int node){
visited[node] = true;
int nodes = 0;
for(int linkedNode : graph[node]){
//삭제된 노드가 아니고 아직 탐색 전인 노드이면
if(linkedNode != deleteNode && !visited[linkedNode]){
//노드 개수 더해주고
nodes++;
DFS(linkedNode);
}
}
//연결된 노드가 하나도 없으면 리프노드
if(nodes == 0){
result++;
}
}
}
반응형
'백준 > DFS BFS' 카테고리의 다른 글
[백준] 16637 : 괄호 추가하기 (JAVA) (0) | 2024.11.15 |
---|---|
[백준] 1240 : 노드 사이의 거리 (JAVA) (0) | 2024.11.09 |
[백준] 7569 : 토마토 (JAVA) (1) | 2024.11.01 |
[백준] 17070 : 파이프 옮기기 1 (JAVA) (0) | 2024.10.07 |
[백준] 24230 : 트리 색칠하기 (JAVA) (0) | 2024.09.30 |