반응형
    
    
    
  1068번: 트리
첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다
www.acmicpc.net
트리를 만들고 dfs를 시행하는 문제였습니다.
풀이방법
1. tree를 생성합니다. 자식이 여러개일 경우를 대비해 자식이 추가될 때마다 vector push_back()을 이용합니다.
2. root node부터 dfs를 시행합니다.
지울 노드를 방문처리하게 되면 그 이하 자식들도 dfs를 하지않게 가능합니다.
2-1. 자식노드가 존재한다면 그 자식노드를 다음 dfs 호출의 인자로 넘겨줍니다.
2-2. 자식노드가 없어 dfs를 호출하지 않게 된다면 leaf 노드이므로 정점을 답에 추가해줍니다.
Code
#include <bits/stdc++.h>
using namespace std;
int n, deleteNodeNum;
vector<int> tree[50];
int visited[50];
int parent;
int root = 0;
int ans = 0;
void dfs(int x) {
	if (visited[x]) return;
	visited[x] = 1;
	bool isLeaf = true;
	for (int i = 0; i < tree[x].size(); i++) {
		int next = tree[x][i];
		if (!visited[next]) {
			dfs(next);
			isLeaf = false; 
		}
	}
	if (isLeaf) ans++;
}
int main(){
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> parent;
		if (parent == -1) root = i;
		else tree[parent].push_back(i);
	}
	cin >> deleteNodeNum;
	visited[deleteNodeNum] = true;
	dfs(root);
	cout << ans << "\n";
}
Test Case
몇 가지 테스트 케이스를 추가해보았습니다.
1. 루트와 자식노드 1개씩 있는 2개의 노드로 구성된 트리에서 자식만 지울경우 
2 
-1 0 
1 
답 : 1 
2. 루트와 자식노드 1개씩 있는 2개의 노드로 구성된 트리에서 부모만 지울경우 
2 
-1 0 
0 
답 : 0
'Algorithm > DFS' 카테고리의 다른 글
| (C++) - 프로그래머스(고득점 kit - (DFS/BFS)) : 타겟 넘버(DFS) 답 (0) | 2021.02.11 | 
|---|---|
| (C++) - 백준(BOJ) 1526번 : 가장 큰 금민수 답 (0) | 2021.02.08 | 
| (C++) - 백준(BOJ) 1189번 : 컴백홈 답 (0) | 2021.01.26 | 
| (C++) - 백준(BOJ) 14503번 : 로봇청소기 답 (0) | 2020.09.22 | 
| (C++) - 백준(BOJ) 11725번 : 트리의 부모 찾기 답 (0) | 2020.09.20 |