[백준 / C++] 1068번: 트리 (DFS)

728x90
728x90

 

 

 

 

https://www.acmicpc.net/problem/1068

 

1068번: 트리

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

www.acmicpc.net

 

난이도: solved.ac 골드 5

 

 

알고리즘 분류

그래프 탐색 (DFS)

 

구현 방법

부모 노드의 번호를 index로 갖는 벡터에 해당 자식 노드의 번호를 저장한다.

(Ex. 4번 노드의 부모가 2면, graph[2].push_back(4))

 

그리고 삭제할 노드의 번호를 입력받는데, 삭제할 노드가 루트 노드라면 트리는 아예 없어지므로 0을 출력하게 한다.

삭제할 노드가 루트 노드가 아니라면 DFS 함수를 실행한다.

 

DFS 탐색을 하다가 특정 노드가 삭제할 노드를 자식으로 갖는다면 일단 삭제할 노드가 위치한 index를 저장하고, 삭제할 노드로의 탐색은 하지 않고 그 노드를 벡터에서 삭제한다.

 

코드

#include <bits/stdc++.h>
using namespace std;

int N, del, ans;
vector<int> graph[50];
void DFS(int x);

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int root, num;
	cin >> N;
	for (int i = 0; i < N; i++) {
		cin >> num;
		if (num == -1) {
			root = i;	// 루트 노드 번호 저장
			continue;
		}
		graph[num].push_back(i);
	}
	cin >> del;	// 삭제할 노드
	if (del != root) {
		DFS(root);
		cout << ans;
	}
	else
		cout << 0;	// root를 삭제하는 경우
}

void DFS(int x) {
	int del_idx = -1;
	for (int i = 0; i < graph[x].size(); i++) {
		if (graph[x][i] == del) {
			del_idx = i;	// 삭제할 노드 저장
			continue;	// 삭제할 노드는 탐색 X
		}
		DFS(graph[x][i]);
	}
	if (del_idx > -1)
		graph[x].erase(graph[x].begin() + del_idx);
	// 해당 노드로의 길 삭제
	if (graph[x].empty())
		ans++;	// 자식 노드가 없으면 리프 노드이므로
}

 

성능

백준 1068번 코드 제출 결과
코드 제출 결과

 

 

 

 

 

반응형