Baekjoon1068-트리
백준 사이트 1068 - 트리 문제입니다.
1. 문제
https://www.acmicpc.net/problem/1068
2. Input , Output
3. 분류 및 난이도
DFS 문제입니다.
백준에서는 Slive1 난이도를 책정하고 있습니다.
4. 생각한 것들
- 트리 구현을 어떻게 할까..?
- 배열을 사용하면 일자로 트리가 진행될 경우 2^50의 배열의 크기가 필요하므로 배열로 만들 수 없습니다.
- 그리고 이진트리라는 말이 없으므로 자식이 여러개일 수 있습니다. 벡터를 통해 만들어줍니다.
- DFS 조건문?
- 트리 자식을 돌아다니다가 remove 값으로 들어온 트리자식을 만나면 return을 해버려 방문을 중단합니다.
- 만약 자식이 1명이고 마침 그 자식이 제거해야하는 것이면 부모 노드는 리프노드가 되므로 갯수를 세주고 방문을 돌아갑니다.
- 예외가 좀 많아서 정답률이 낮은 것 같습니다.
5. code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include<iostream>
#include<vector>
using namespace std;
vector<int> v[51];
int removenode = 0;
int result = 0;
void DFS(int now)
{
if (removenode == now)
return;
if (v[now].size() == 0)
{
++result;
return;
}
else if (v[now].size() == 1)
{
if (v[now][0] == removenode)
{
++result;
}
}
for (int i = 0; i < v[now].size(); ++i)
DFS(v[now][i]);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
int node = 0;
int temp = 0;
int remove = 0;
cin >> n;
for (int i = 0; i < n; ++i)
{
cin >> temp;
if (temp != -1)
{
v[temp].push_back(i);
}
else
node = i;
}
cin >> removenode;
DFS(node);
cout << result;
}
6. 후기
DFS같은 재귀는 언제나 어려운것 같습니다.
BFS만세
This post is licensed under CC BY 4.0 by the author.