일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 이진탐색
- 그리디
- 이분탐색
- 비트마스크
- dfs
- 이분매칭
- 수학
- 삼분탐색
- 구현
- 좌표압축
- 펜윅트리
- LazyPropagation
- 누적합
- 위상정렬
- 정렬
- DP
- MST
- 투포인터
- 백준
- 세그먼트트리
- lca
- BFS
- 크루스칼
- 다익스트라
- lis
- DisjointSet
- 플로이드와샬
- 에라토스테네스의 체
- 브루트포스
- boj
Archives
- Today
- Total
lastknight00
[백준] 트리(1068) 본문
문제 링크 : [백준] 트리(1068)
문제 설명
트리 구조가 주어지고, 특정 노드 하나를 지웠을 때, 리프 노드의 수를 구하세요.
입력
N(노드의 수, 1 <= N <= 50)
Pi(부모 노드, 1 <= Pi <= N, 루트 노드는 -1)
5
-1 0 0 1 1
2
출력
2
카테고리
#트리 #BFS #DFS
시간 복잡도 상한
엄청 커도 됩니다.
해결 방법
- 트리를 순회 하면서 리프 노드의 수를 세면 됩니다.
- DFS든 BFS든 상관 없을 것 같습니다.
- 삭제 된 노드를 만난 경우, 그 노드를 방문하지 않고 넘어가면 됩니다.
- 여기까지만 하면 될 것 같지만, 몇가지 예외 사항이 있습니다.
4-1. 삭제된 노드가 루트 노드인 경우, 모든 노드가 삭제되었기 때문에 0을 출력해야 합니다.
4-2. 삭제된 노드의 부모 노드가 하나의 자식 노드(삭제된 노드)를 가진 경우, 그 노드의 자식이 모두 사라졌기 때문에, 그 노드가 다시 리프 노드가 됩니다. - 이 경우를 잘 처리하시면 됩니다.
- 주변에서도 그렇고 질문에서도 이진트리로 문제를 푸신 분이 계시는데, 문제 어디에도 트리가 이진트리라는 언급은 없습니다.
- 문제를 풀 때, 문제를 꼼꼼히 읽어보시고, 주어진 내용들로 논리적 오류 없이 조건들을 추론해야 합니다.
- 주관적인 견해가 절대 들어가면 안됩니다.
시간복잡도
O(N)
코드
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
int n,t,i,r,c,l;
vector<int>v[50];
queue<int>q;
int main(){
scanf("%d",&n);
for (;i<n;i++){
scanf("%d",&t);
if(t>=0)v[t].push_back(i);
else r=i;
}
scanf("%d",&n);
if(r==n){
printf("0");
return 0;
}
q.push(r);
t=0;
while(!q.empty()){
c=q.front();q.pop();
l=v[c].size();
for(i=0;i<v[c].size();i++){
if(v[c][i]==n)l--;
else q.push(v[c][i]);
}
t+=!l;
}
printf("%d",t);
}
'PS' 카테고리의 다른 글
[백준] 기타 레슨(2343) (0) | 2020.06.09 |
---|---|
[백준] 교차개수세기(1615) (0) | 2020.06.09 |
[백준] 책정리(1818) (0) | 2020.06.08 |
[백준] 정렬(1083) (0) | 2020.06.08 |
[백준] 수 고르기(2230) (0) | 2020.06.07 |
Comments