코테/백준 문제풀이

백준 9934 완전이진트리

밤밭황제 2021. 8. 3. 00:45

https://www.acmicpc.net/problem/9934

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
	int arr[1024] = {0};
	int H, cnt;
	int parr[11][1024] = {0};

	int N;
	int num;
	scanf("%d", &H);

	num =(int)pow(2, H);
	cnt = num - 1;

	for (int i = 0; i < cnt; i++)
	{
		scanf("%d", &N);
		arr[i] = N;
	}
	int level = H;

	int temp[1024] = {0};
	while (H > 0)
	{
		for (int j = 0; j < pow(2, H) - 1; j++)
		{
			if (j % 2 == 0)
				parr[H][j] = arr[j];
			else
				temp[j / 2] = arr[j];
		}
		for (int k = 0; k < cnt / 2; k++)
		{
			arr[k] = temp[k];
		}
		H--;
	}
	H = level;
	for (int i = 1; i <= H; i++)
	{
		for (int j = 0; j < pow(2, H)-1; j=j+2)
		{
			if (parr[i][j] == 0)
				break;
			printf("%d ", parr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

 

거꾸로 생각해 보았다.

예제로 주어진 배열 1 6 4 3 5 2 7 에서 짝수 번째 index의 수만 모아 놓으면 {1,4,5,7} 이고 이를 제외한 배열은{6,3,2}이다. {6,3,2}에서 짝수 번째 index의 수만 모아 놓으면 {6,2} 이고 {3}이 남는다.

느낀점 : 처음에 좀 많이 헤맸다. 알고리즘 분류에 재귀라고 써있어서 재귀로 해보다가 힘들어서 그냥 했다.

 

728x90