어흥

[백준 1068] 트리 (C++) 본문

알고리즘/백준

[백준 1068] 트리 (C++)

라이언납시오 2020. 3. 11. 16:43
728x90
반응형

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

 

1068번: 트리

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

www.acmicpc.net

1. 주의할 점

- For문을 최대한 덜 사용하도록 한다.

- 배단 Vector를 통해 자식의 정보를 저장한다

- Boolean 배열을 사용하여 해당 Node가 삭제되었는지 확인한다

 

2. 구현

- 큐를 사용하여 지우려는 Node를 큐에 삽입하고 해당 Node의 Erased 배열값을 True로 설정한다.

- 큐에서 Pop을 통해 얻은 Node 번호에 자식이 있다면 전부 Erased 배열의 값을 True로 전환한다.

- 위의 작업을 모두 마친 이후, 0~N-1까지 Node가 지워지지 않은 노드이며 밑의 자식이 없을 경우(지워진 자식 Node 갯수 == 기존에 가지고 있던 자식 Node의 갯수 ) Result++을 진행한다.

 

#include <vector>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
bool erased[50] = { false, };
vector<int> v[50];
int main() {
	int num, tt, target;
	cin >> num;
	for (int i = 0; i < num; i++) {
		cin >> tt;
		if (tt == -1) continue;
		v[tt].push_back(i);
	}
	cin >> target;
	//해당 Node와 그 밑의 Node들의 erased값을 true로 바꾼다
	queue<int> q;
	q.push(target);
	erased[target] = true;
	while (!q.empty()) {
		int cidx = q.front();
		q.pop();
		for (int i = 0; i < v[cidx].size(); i++) {
			int next = v[cidx][i];
			if (!erased[next]) {
				q.push(next);
				erased[next] = true;
			}
		}
	}
	int result = 0;
	for (int i = 0; i < num; i++) {
		bool leaf = true;
		if (!erased[i]) {
			int cnt = 0;
			for (int j = 0; j < v[i].size(); j++) {
				if (erased[v[i][j]]) cnt++;
			}
			if (cnt == v[i].size())
				result++;
		}
	}
	cout << result;
	system("pause");
	return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 16179] 두 동전 (C++)  (0) 2020.03.11
[백준 11578] 팀원 모집 (C++)  (0) 2020.03.11
[백준 15989] 1,2,3 더하기 4 (C++)  (0) 2020.03.11
[백준 1072] 게임 (C++)  (0) 2020.03.11
[백준 12786] INHA SUIT (C++)  (0) 2020.03.10
Comments