https://www.acmicpc.net/problem/9934
9934번: 완전 이진 트리
상근이는 슬로베니아의 도시 Donji Andrijevci를 여행하고 있다. 이 도시의 도로는 깊이가 K인 완전 이진 트리를 이루고 있다. 깊이가 K인 완전 이진 트리는 총 2K-1개의 노드로 이루어져 있다. (아래
www.acmicpc.net
되게 이상한 규칙을 찾아서 재귀로 풀려고 했는데 틀렸다.
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
/*처음에 상근이는 트리의 루트에 있다.
왼쪽을 먼저 방문한다.
그 다음 중앙 방문
오른쪽 방문
위로 이동
*/
int k; // 1<= k <= 10; k = 10일 때 전체 노드 수 = 1024 -> 배열을 전체로 잡으면 1050으로 잡으면 될듯
int nodeCount;
vector<int> treeNode;
vector<int> tree[14];
void go(int size, int level)
{
if (level == 0) {
//cout << "push back level : " << level << " index:" << size / 2 << " r:" << treeNode[size / 2] <<"\n";
tree[level].push_back(treeNode[size / 2]); //절반에 들어있는 수가 루트의 수가 된다. -> 1레벨에 루트노드를 넣어준다.
go(size - (size / 2 + 1), level + 1);
return;
}
else if (level == k - 1) { //리프노드까지 왔다
//지금 들어온 size index의 양 옆
//cout << "push back level : " << level << " index:" << size / 2 << " r:" << treeNode[size -1] << " & " << treeNode[size + 1] << "\n";
tree[level].push_back(treeNode[size - 1]);
tree[level].push_back(treeNode[size + 1]);
return;
}
//level이 0이 아니라면
for (int i = 0; i < level; i++) {
tree[level].push_back(treeNode[size - (size / 2) - 1]);
tree[level].push_back(treeNode[size + (size / 2) + 1]);
go(size - (size / 2) - 1, level + 1);
go(size + (size / 2) + 1, level + 1);
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> k;
//cout << pow(2, k);
nodeCount = pow(2, k) - 1;
for (int i = 0; i < nodeCount; i++) {
int t; cin >> t;
treeNode.push_back(t);
}
go(nodeCount, 0);
for (int i = 0; i < 10; i++) {
if (tree[i].size() == 0) continue;
for (int j = 0; j < tree[i].size(); j++) {
//cout << "i: " << i << " j: " << j << "\n";
cout << tree[i][j] << " ";
}
cout << "\n";
}
}
그래도 정답을 보니 아이디어는 맞았던게 절반을 잘라서 계속 나아간다는 것은 맞았다.
내가 생각하지 못한 점은 배열을 잘라서 재귀를 돌리면 된다는 것이었다.
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int k;
int a[1030];
vector<vector<int>> tree(10);
void go(int s, int e, int level)
{
if (s > e) return;
if (s == e) {
tree[level].push_back(a[s]);
return;
}
tree[level].push_back(a[(s+e) / 2]);
//cout << "push back num : " << a[ (s + e) / 2] << " level : " << level << " \n";
go(s, (s + e) / 2 - 1, level + 1);
go((s + e) / 2 + 1, e, level + 1);
return;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> k;
int nodeCount = pow(2, k) - 1;
for (int i = 0; i < nodeCount; i++)
{
int t; cin >> t;
a[i] = t;
}
//cout << "node COunt : " << nodeCount << " \n";
go(0, nodeCount - 1, 0);
//cout << " OVER";
for (int i = 0; i < tree.size(); i++) {
if (tree[i].size() == 0) continue;
for (int j = 0; j < tree[i].size(); j++) {
cout << tree[i][j] << " ";
}
cout << "\n";
}
}
'백준 문제 풀이 & C++ 공부' 카테고리의 다른 글
백준 17471 C++ (0) | 2024.04.17 |
---|---|
백준 14620 C++ (0) | 2024.03.25 |
백준 3197 C++ (0) | 2024.03.06 |
백준 2529 C++ (0) | 2024.03.06 |
백준 4179 C++ (0) | 2024.02.20 |