https://www.acmicpc.net/problem/1068
- 각 부모마다
자식 리스트
만들기리프 노드 리스트
만들기
- 누군가의 부모이면
리프노드 = false
지운 노드
가루트 노드
이면 무조건 0 리턴- 처음
리프 노드의 개수
구하기지운 노드
의자식 리스트
를 방문하기
리프노드
면 처음에 구한리프노드의 개수
빼기리프노드
가 아니면자식 리스트
를 방문하기 (반복)지운 노드의 부모
가리프노드
인지 체크하기
지운 노드 부모
의자식 리스트
에서지운 노드
를 제거 했을 때,자식 리스트
개수가 0개이면리프노드
개수 더하기
2
-1 0
1
정답 : 1
9
-1 0 0 5 2 4 4 6 6
4
정답 : 2
2
1 -1
0
정답 : 1
5
1 2 3 4 -1
3
정답 : 1
2
1 -1
1
정답 : 0
1
-1
0
정답 : 0
#include <iostream>
#include <queue>
#include <string.h> // memset
#include <algorithm>
#define MAX 50
using namespace std;
int N;
int parent[MAX];
int deletedNode;
void fastIO() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
}
void input() {
cin >> N;
for(int i=0; i<N; i++) {
cin >> parent[i];
}
cin >> deletedNode;
return;
}
int solve(int N, int parents[], int deletedNode) {
int answer = 0;
vector<int> childs[MAX];
bool isLeafNode[N];
int rootNode;
memset(isLeafNode, true, sizeof(isLeafNode));
// 연결
for(int child=0; child<N; child++) {
if (parents[child] != -1) {
isLeafNode[parents[child]] = false; // 부모 -> 리프 노드 아님
childs[parents[child]].push_back(child); // 부모 - 자식
} else {
rootNode = child;
}
}
// 루트 노드를 삭제하면 0이 나와야한다.
if (deletedNode == rootNode) {
return answer;
}
// 리프 노드 개수
for(int i=0; i<N; i++) {
if (isLeafNode[i]) answer++;
}
queue<int> q;
q.push(deletedNode);
while(!q.empty()) {
int curr = q.front();
q.pop();
if (isLeafNode[curr]) {
answer--;
} else {
for(int child : childs[curr]) {
q.push(child);
}
}
}
// 지운거의 부모
int target = parents[deletedNode];
if (find(childs[target].begin(), childs[target].end(), deletedNode) != childs[target].end()) {
childs[target].erase(remove(childs[target].begin(), childs[target].end(), deletedNode));
}
if (childs[target].size() == 0) answer++;
return answer;
}
void output(int answer) {
cout << answer << '\n';
}
int main() {
fastIO();
input();
output(solve(N, parent, deletedNode));
}
vector erase, remove 잘 다룰 수 있기!!
없을 때 지우는 거 처리 안했어서 seg fault 났었다..