본문 바로가기
BaekJoon/C++

11279 : 최대 힙 (C++)

by GrayChoi 2021. 2. 24.
반응형

 

11279번: 최대 힙

첫째 줄에 연산의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가

www.acmicpc.net


우선순위 큐를 공부하기 위해 최대 힙을 공부했다.

clude<iostream>
#include<vector>

using namespace std;

vector<int> v;

/*
왼쪽 자식의 인덱스 = 부모 인덱스 * 2 + 1
오른쪽 자식의 인덱스 = 부모 인덱스 * 2 + 2
부모 인덱스 = 자신 인덱스 - 1 / 2
*/

void push(int data) {
    int i = v.size();
    v.push_back(data);

    while(i != 0 && v[i] > v[(i-1)/2]) {
        // 처음 삽입할 때가 아니면서 부모노드보다 자식노드가 클 때
        swap(v[i], v[(i-1)/2]);
        // 부모노드와 자식노드 위치 교환 후
        i = (i-1)/2;
        // 부모노드로 올라가서 다시 비교 후 교체
    }
}

int pop() {
    if(v.size() == 0) {
        return 0;
    }

    int result = v[0];
    // 최대 힙의 맨 첫번째 값을 변수에 입력 후
    v[0] = v[v.size()-1];
    // 힙의 맨 마지막 값을 첫번째 값으로 올림
    v.pop_back();
    // 마지막 노드 삭제
    int p = 0;

    // 첫번째 노드의 값을 아래로 내려가며 비교후 교체
    while(1) {
        int child = p * 2 + 1;
        // 왼쪽 자식의 값

        if(child >= v.size()) {
            // 자식이 더이상 없을 때
            break;
        }

        if(v[child] < v[child+1]) {
            // 왼쪽 자식보다 오른쪽 자식이 더 클 때
            child++;
        }

        if(v[child] > v[p]) {
            // 자식노드 더 크다면
            swap(v[child], v[p]);
            // 부모노드와 교체 한 후
            p = child;
            // 아래로 내려간다.
        } else {
            // 부모노드가 자식노드보다 크면
            break;
        }
    }
    return result;
}

int main() {
    int test;

    scanf("%d", &test);

    for(int i = 0; i < test; i++) {
        int input;
        scanf("%d", &input);

        if(input == 0) {
            printf("%d\n", pop());
        } else {
            push(input);
        }
    }

    return 0;
}

 

반응형

'BaekJoon > C++' 카테고리의 다른 글

2589 : 보물섬 (C++)  (0) 2021.02.24
1927 : 최소 힙 (C++)  (0) 2021.02.24
2638 : 치즈 (C++)  (0) 2021.02.22
2636 : 치즈 (C++)  (0) 2021.02.22
14502 : 연구소 (C++)  (0) 2021.02.20

댓글