문제
- 첫재 줄에 n이 주어집니다. 정점의 개수가 n개인 트리이며, 트리의 정점은 0번부터 n-1까지 입니다.
- 둘째 줄에 각 정점의 부모 정점의 정보가 주어집니다. (-1이면 루트 노드 입니다.)
- 셋째 줄에 지울 노드 한개가 주어집니다.
- n(1 <= n <= 50) 정점의 수
- 시간 제한 2초
- 문제 링크
접근 과정
1. 탐색
- 사실 어려운 문제는 아닙니다. 1) 그래프를 구현하고, 2) BFS, DFS 아무거나 사용해서 탐색해주면 됩니다.
단, 저는 루트 노드도 지울 수 있다는 점을 망각해서... 여러번 틀렸습니다.
2. 시간 복잡도 계산
- 1) 트리를 BFS로 탐색하는데 걸리는 시간은 log(V+E) V는 정점의 수, E는 간선의 수, 트리에서 E는 항상 V-1 이기 때문에 시간은 O(n), 상수생략
- n(1 <= n <= 50) 정점의 수 이기 때문에 O(n)은 O(50) 문제의 시간 제한이 2초 이기 때문에 시간안에 풀 수 있습니다.
코드
1. C++
#include <iostream>
#include <vector>
#include <queue>
#define max_int 51
using namespace std;
int n, num, root_node, result = 0;
vector<int> v[max_int];
bool check[max_int];
void bfs(int start){
check[start] = true;
queue<int> q;
q.push(start);
while(!q.empty()){
int node = q.front();
q.pop();
int child_cnt = 0;
for(int i=0; i<v[node].size(); i++){
int next = v[node][i];
if(!check[next]){
child_cnt++;
check[next] = true;
q.push(next);
}
}
if(child_cnt == 0){
result++;
}
}
}
int main(){
scanf("%d", &n);
for(int i=0; i<n; i++){
scanf("%d", &num);
if(num != -1){
v[num].push_back(i);
v[i].push_back(num);
}
else {
root_node = i;
}
}
scanf("%d", &num);
check[num] = true;
if(!check[root_node]) bfs(root_node);
printf("%d\n", result);
}