[백준] 1068번 트리

Peace·2021년 2월 28일
0

[백준] 1068번 트리

문제 링크: https://www.acmicpc.net/problem/1068

문제

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

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

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

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

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

입력

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

출력

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

문제 접근

tree,dfs문제이다.
1. 입력을 받을때, vector를 사용해 계층 구조를 정의한다.
2. 지울 노드와 root node를 입력해, dfs를 시작한다.

leaf node의 판단은 재귀 함수로 구현했을때, 자신보다 하위 관계에 있는 것들이 없는 것으로 leaf node라고 판단한다.

코드 구현(c++)

#include <iostream>
#include <vector>

using namespace std;

vector<int> tree[51];
int leafNum[51];
int dfs(int n, int deleteNode){
    int cnt = 0;
    if(n == deleteNode ) return cnt;
    for(int i = 0 ; i < tree[n].size() ; i++){
        cnt += dfs(tree[n][i], deleteNode);
    }
    if(cnt == 0) cnt = 1;
    return cnt;
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);cout.tie(NULL);

    int nodeNum, root, deleteNode;
    cin >> nodeNum;
    int temp;
    for(int i = 0 ; i < nodeNum ; i++){
        cin >> temp;
        if(temp == -1) root = i;
        else tree[temp].push_back(i);
    }
    cin >> deleteNode;
    
    cout << dfs(root, deleteNode) << "\n";

}
profile
https://peace-log.tistory.com 로 이사 중

0개의 댓글