Language Grammar/C++

2024 - 08- 08 C++ 코딩테스트 10주완성 D+29

Jang_^ 2024. 8. 8. 20:55
백준 1068 문제 - 트리

 

트리에서 리프 노드란, 자식의 개수가 0인 노드를 말한다.

트리가 주어졌을 때, 노드 하나를 지울 것이다. 그 때, 남은 트리에서 리프 노드의 개수를 구하는 프로그램을 작성하시오. 노드를 지우면 그 노드와 노드의 모든 자손이 트리에서 제거된다.

예를 들어, 다음과 같은 트리가 있다고 하자.

현재 리프 노드의 개수는 3개이다. (초록색 색칠된 노드) 이때, 1번을 지우면, 다음과 같이 변한다. 검정색으로 색칠된 노드가 트리에서 제거된 노드이다.

이제 리프 노드의 개수는 1개이다.

입력

 

첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다. 셋째 줄에는 지울 노드의 번호가 주어진다.

 

출력

 

첫째 줄에 입력으로 주어진 트리에서 입력으로 주어진 노드를 지웠을 때, 리프 노드의 개수를 출력한다.

 

 

실습코드

 

#include<bits/stdc++.h>
using namespace std;
int n, r, temp, root;
vector<int> adj[54];
int dfs(int here){
    int ret = 0;
    int child = 0;
    for(int there : adj[here]){
        if(there == r) continue;
        ret += dfs(there);
        child++;
    }
    if(child == 0) return 1;
    return ret;
}
int main(){    
    cin >> n;
    for(int i = 0; i < n; i++){
        cin >> temp;
        if(temp == -1)root = i;
        else adj[temp].push_back(i);
    }
    cin >> r;
    if(r == root){
        cout << 0 << "\n";return 0;
    }
    cout << dfs(root) << "\n";
    return 0;
}

 

이 문제는 트리에 관한 문제이므로 Vector를 이용하여 문제를 푸는 것이 핵심이다.

 

dfs 알고리즘으로 탐색하였으며,

 

제외하려는 노드의 숫자가 나올시 continue 로 하여 자식노드까지 검사를 안하게 하였으며,

 

그외에 노드들은 끝까지 검사를 한 다음에 맨밑에 있는 리프노드의 값 1을 전부 더하여서 int 형으로 반환

 

해당노드를 제외한 나머지 노드들의 갯수를 알 수 있다!!