https://www.acmicpc.net/problem/1068
1068번: 트리
첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다
www.acmicpc.net
public class 트리 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
Node tree[] = new Node[N];
for (int i = 0; i < N; i++) {
tree[i] = new Node();
}
int rootNode = 0;
for (int i = 0; i < N; i++) {
int value = Integer.parseInt(st.nextToken());
if (value == -1) {
rootNode = i;
} else {
tree[value].child.add(i);
}
}
answer = 0;
int removeNum = Integer.parseInt(br.readLine());
if (rootNode == removeNum) {
System.out.println(0);
} else {
removeDfs(rootNode, tree, removeNum);
dfs(rootNode, tree, removeNum);
System.out.println(answer);
}
}
private static void removeDfs(int curNum, Node[] tree, int removeNum) {
for (int i = 0; i < tree[curNum].child.size(); i++) {
if (tree[curNum].child.get(i) == removeNum) {
tree[curNum].child.remove(i);
return;
} else {
removeDfs(tree[curNum].child.get(i), tree, removeNum);
}
}
}
static int answer;
private static void dfs(int curNum, Node[] tree, int removeNum) {
for (int i = 0; i < tree[curNum].child.size(); i++) {
dfs(tree[curNum].child.get(i), tree, removeNum);
}
if (tree[curNum].child.isEmpty()) {
answer++;
}
}
static class Node {
ArrayList<Integer> child = new ArrayList<Integer>();
}
}
문제의 예시가 이진 트리여서 이진 트리 문제인줄 알았는데 트리였었다..
루트가 나중에 나오는 경우에 대해서 이해만 한다면 풀 수 있는 문제였다.
예를 들어 3 0 0 -1 1 의 경우
3
0
1 2
4
위의 그림과 같이 표현됩니다.
각 노드에 동적으로 자식을 담을 수 있는 ArrayList형식의 배열을 사용했습니다.
노드 삭제의 경우 루트의 위치에서 내려가면서 삭제 할 노드가 나오면 삭제했습니다.
'알고리즘' 카테고리의 다른 글
[백준] 21610 마법사 상어와 비바라기 - java (2) | 2021.06.25 |
---|---|
[프로그래머스] 문자열 내 마음대로 정렬하기 - java (0) | 2021.06.24 |
[프로그래머스] [3차]압축 - java (0) | 2021.05.07 |
[백준] 회문 - java (0) | 2021.05.05 |
[백준] 문자열 폭발 - java (0) | 2021.05.04 |