주어진 트리에서 입력으로 주어진 노드를 지웠을 때, 남은 리프 노드의 개수를 출력하는 문제.
벡터 adj
에 트리의 정보를 저장한 뒤, dfs
함수를 호출하여 노드를 삭제한 이후 남아있는 리프 노드의 개수를 구한다.
adj
를 root
부터 순회하며 리프 노드의 개수를 구해나간다. 이때 만약 현재 탐색하는 노드가 삭제해야 하는 노드라면, 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;
}
평소에 알고리즘 문제를 풀 때 많이 어려움을 느꼈는데, 이번 포스팅에서는 깔끔한 문제 설명과 함께 해결 방법을 잘 설명해주셔서 큰 도움이 되었습니다. 특히 dfs 함수를 이용한 풀이 방식이 신선했습니다. 앞으로도 이런 유익한 글 많이 올려주시면 감사하겠습니다!