//https://www.acmicpc.net/problem/1068 #include <iostream> | |
#include <vector> | |
using namespace std; | |
int tree[50][50];//tree[i][0] : i 번째 노드의 자식 수 | |
//tree[i][j] : i번째 노드의 자식 index | |
int n, d, ans; | |
void search(int tmp); | |
int main(){ | |
cin >> n; | |
int root; | |
for(int i=0; i<n; ++i){ | |
int p; | |
cin >> p; | |
if(p==-1) root=i; | |
else{ | |
tree[p][0]++; | |
tree[p][tree[p][0]]=i; | |
} | |
} | |
cin >> d; | |
if(root==d) { | |
cout << ans; | |
return 0; | |
} | |
int tmp=root; | |
search(tmp); | |
cout << ans; | |
return 0; | |
} | |
void search(int tmp){ | |
int k=tree[tmp][0]; | |
for(int i=1; i<=k; i++){ | |
int next=tree[tmp][i]; | |
if(next==d) { | |
if(tree[tmp][0]==1) ans++; | |
continue; | |
} | |
if(tree[next][0]!=0)search(next); | |
else ++ans; | |
} | |
return; | |
} |
재귀와 예외처리로 문제 해결
예외처리한 부분
1. root==d(삭제할 것) 0 출력되도록
2. 자식이 하나뿐인 노드에 대해서 그 자식이 삭제할 노드라면 ans++하도록 함. 자식이 삭제되면 자신이 단말 노드가 되기 때문
노드개수가 50개로 한정적이라 tree[50][50]으로 배열 선언해서 문제를 품
-이진트리가 아니기 때문에 수많은 자식 트리의 포인터를 저장하는 구조체를 만들기는 애매하다 느꼈음
-자식의 개수는 본인을 제외한다면 최대 49개, [50][50]은 0~49이기때문에 49번째 자식의 idx까지 저장 가능
-tree[i][0]에는 i의 자식의 개수를 저장해서 탐색 시 반복문(for)의 반복 횟수로 사용했음
'알고리즘 문제 풀이 > 1DP_과제(~180615)' 카테고리의 다른 글
180425_1568_새 (0) | 2018.04.25 |
---|---|
180424_1032_베스트셀러 (0) | 2018.04.24 |
180423_1003_피보나치 함수 (0) | 2018.04.23 |
180423_3047_ABC (0) | 2018.04.23 |
180423_10825_국영수 (0) | 2018.04.23 |