알고리즘/트리
[BOJ 1068] 트리 (Java, DFS)
leejinwoo1126
2023. 6. 26. 21:00
반응형
문제 링크
https://www.acmicpc.net/problem/1068
1068번: 트리
첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다
www.acmicpc.net
문제 풀이
- 인접 리스트로 트리 정의
- 제거할 노드(REMOVE_NODE)를 인접 리스트 순회하면서 제거
- LEAF 노드 배열 값을 갱신하며 DFS 탐색
- 최종적으로 ROOT 노드의 있는 값을 출력하면 됨
- 시간 복잡도 : O(N) , (N <= 50)
제출 코드
import java.io.*;
import java.util.*;
public class Main {
static int N, REMOVE_NODE, ROOT;
static List<Integer>[] adj;
static int[] LEAF;
static void input() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
LEAF = new int[N];
adj = new ArrayList[N];
for(int i = 0; i < N; i++) adj[i] = new ArrayList<>();
st = new StringTokenizer(br.readLine());
for(int i = 0; i < N; i++) {
int parent = Integer.parseInt(st.nextToken());
if(parent == -1) {
ROOT = i;
continue;
}
adj[parent].add(i);
}
REMOVE_NODE = Integer.parseInt(br.readLine());
}
static void dfs(int node) {
if(adj[node].isEmpty()) {
LEAF[node] = 1;
return;
}
for(int child : adj[node]) {
dfs(child);
LEAF[node] += LEAF[child];
}
}
static void pro() {
for(int i = 0; i < N; i++) {
if(adj[i].contains(REMOVE_NODE)) {
adj[i].remove(adj[i].indexOf(REMOVE_NODE));
}
}
if(ROOT != REMOVE_NODE) dfs(ROOT);
System.out.println(LEAF[ROOT]);
}
public static void main(String[] args) throws Exception {
input();
pro();
}
}
반응형