시나브로

2075. N번째 큰 수 본문

알고리즘/백준

2075. N번째 큰 수

혬혬 2020. 1. 14. 20:24
728x90

힙을 사용하면 금방 성공할 거 같았는데 진짜 많은 오류에 직면한 문제이다.

처음에는 N개의 노드를 가진 최소힙을 만들어서 구현하였지만, 자꾸 틀렸습니다라고 해서

도데체 무슨 오류인지 몰라서 고민하다가

책을 참조해보니 부모노드가 pointer/2가 아니라 (pointer-1)/2라는 것을 알게 되었다. 

그래도 계속 틀렷다고 해서 모든 값을 가진 최대힙을 구현해서 n만큼 pop울 해줬다.

아직까지도 왜 처음 시도였던 n개의 최소힙이 성공이 안 됫는지 모른다.

부모 노드는 (pointer-1)/2이다!!

#include <stdio.h>
int list[2250010] = { 0 };
int pp = 0;
void swap(int i, int j) {
	int temp = list[i];
	list[i] = list[j];
	list[j] = temp;
}
void insert_heap(int value) {
	list[pp] = value;
	int pointer = pp++;
	while (1) {
		if (list[pointer] <= list[(pointer-1) / 2])
			return;
		swap(pointer, (pointer-1) / 2);
		pointer = (pointer - 1) / 2;
	}
}
int delete_haap() {
	int box = list[0];
	list[0] = list[--pp];
	list[pp] = 0;
	int pointer = 0;
	while (1) {
		if (pointer * 2 + 2 >= 2250010)
			break;
		if (list[pointer * 2 + 1] == 0 && list[pointer * 2 + 2] == 0)
			break;
		if (list[pointer * 2 + 1] > list[pointer * 2 + 2]) {
			swap(pointer * 2 + 1, pointer);
			pointer = pointer * 2 + 1;
		}
		else {
			swap(pointer * 2 + 2, pointer);
			pointer = pointer * 2 + 2;
		}
	}
	return box;
}
int main(void) {
	freopen("inp.inp", "r", stdin);
	freopen("out.out", "w", stdout);
	int number = 0;
	int buffer = 0;
	int count = 0;
	scanf("%d", &number);
	for (int i = 0; i < number * number; i++) {
		scanf("%d", &buffer);
		insert_heap(buffer);
	}
	for (int i = 0; i < number - 1; i++)
		delete_haap();
	printf("%d\n", delete_haap());
	return 0;
}
728x90

'알고리즘 > 백준' 카테고리의 다른 글

1181. 단어 정렬  (0) 2020.01.16
15829. Hashing  (0) 2020.01.14
1551. 수열의 변화  (0) 2020.01.13
8393 합  (0) 2020.01.09
[백준] 체스판 다시 칠하기  (0) 2019.12.31
Comments