[c++] 백준 1068, 트리

김현섭·2023년 7월 21일
1

[C++] 백준

목록 보기
22/36

백준 1068

🌲 문제 요약

주어진 트리에서 입력으로 주어진 노드를 지웠을 때, 남은 리프 노드의 개수를 출력하는 문제.

🌲 문제 풀이

벡터 adj에 트리의 정보를 저장한 뒤, dfs 함수를 호출하여 노드를 삭제한 이후 남아있는 리프 노드의 개수를 구한다.
adjroot부터 순회하며 리프 노드의 개수를 구해나간다. 이때 만약 현재 탐색하는 노드가 삭제해야 하는 노드라면, continue하여 해당 노드 방향을 연산에서 제외한다.

🌲 주의

노드의 부모로 -1을 입력받는 경우에는, adj[-1]에 값을 저장하지 않도록 주의한다.

🌲 코드

#include <bits/stdc++.h>

using namespace std;
int n, r, root;
vector<int> adj[55];

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;
	else return ret;
}

int main() {
	cin >> n;
	for (int i = 0; i < n; i++) {
		int tmp;
		cin >> tmp;
		if (tmp == -1) root = i;
		else adj[tmp].push_back(i);
	}
	cin >> r;
	if (r == root) cout << 0 << '\n';
	else cout << dfs(root) << '\n';
	
	return 0;
}
profile
오롯이 밤길을 달래는 별에게로

1개의 댓글

comment-user-thumbnail
2023년 7월 21일

평소에 알고리즘 문제를 풀 때 많이 어려움을 느꼈는데, 이번 포스팅에서는 깔끔한 문제 설명과 함께 해결 방법을 잘 설명해주셔서 큰 도움이 되었습니다. 특히 dfs 함수를 이용한 풀이 방식이 신선했습니다. 앞으로도 이런 유익한 글 많이 올려주시면 감사하겠습니다!

답글 달기