PS

BOJ 11279 - 최대힙, BOJ 1927 - 최소힙

728x90

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

 

11279번: 최대 힙

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

www.acmicpc.net

 

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

 

1927번: 최소 힙

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

www.acmicpc.net

 

둘은 구현 방식에 있어서 큰 차이가 있는 문제가 아니기 때문에 하나로 묶었다.

 

처음에는 아래 처럼 힙을 클래스를 사용해서 직접 구현하려 했다.

 

- c++

#include <iostream>
#define MAX 100001
 
using namespace std;
 
int N;
 
class MinHeap {
   private:
    int arr[MAX];
    int size;
 
   public:
    MinHeap();
    void swap(int* a, int* b);
    void insert(int x);
    void delete_data();
    int arr_size();
};
 
MinHeap::MinHeap() {
    this->size = 0;
}
 
void MinHeap::swap(int* a, int* b) {
    int temp = *a;
    *= *b;
    *= *a;
}
 
void MinHeap::insert(int x) {
    int here = ++this->size;
 
    while ((here != 1&& x < this->arr[here / 2]) {
        this->arr[here] = this->arr[here / 2];
        here /= 2;
    }
    this->arr[here] = x;
}
 
void MinHeap::delete_data() {
    if (this->size == 0return;
    int root_node = this->arr[1];
    this->arr[1= this->arr[this->size--];
 
    int parent = 1;
    int child;
 
    while (1) {
        child = parent * 2;
        if (child + 1 <= this->size && this->arr[child] > this->arr[child + 1])
            child++;
 
        if (child > this->size || this->arr[child] > this->arr[parent])
            break;
 
        this->swap(&this->arr[parent], &this->arr[child]);
        parent = child;
    }
 
    cout << root_node << '\n';
    return;
}
 
int MinHeap::arr_size() {
    return this->size;
}
 
int main() {
    cin.tie(nullptr);
    ios_base::sync_with_stdio(false);
 
    cin >> N;
 
    MinHeap mh;
 
    for (int i = 0; i < N; i++) {
        int x;
        cin >> x;
 
        if (x == 0) {
            if (!(mh.arr_size())) {
                cout << 0 << '\n';
            } else {
                mh.delete_data();
            }
        } else if(x > 0) {
            mh.insert(x);
        }
    }
 
    return 0;
}
cs

 

 

 

이렇게 풀다 보면 코드도 길뿐더러, 통과도 하지 못했다.

 

그러다가 다른 사람이 푼것을 봤는데,

출처 : https://jaimemin.tistory.com/1005

 

백준 1927번 최소 힙

문제 링크입니다: https://www.acmicpc.net/problem/1927 단순 최소 힙 구현 문제였습니다. #include #include #include #include using namespace std; int main(void) {        ios_base::sync_with_stdi..

jaimemin.tistory.com

 

이런 유형은 이렇게 STL 을 이용해서 빠르게 풀어야 되는것임을 느끼게 되었다.

아래는 최대 힙에 대한 코드다 (최소힙은 less<int> 를 greater<int> 로 바꾸면 된다)

- c++

#include <iostream>
#include <queue>
#include <vector>
 
using namespace std;
 
int N;
 
int main() {
    cin.tie(0);
    ios_base::sync_with_stdio(0);
 
    cin >> N;
 
    priority_queue<intvector<int>, less<int>> pq;
 
    for (int i = 0; i < N; i++) {
        int x;
        cin >> x;
 
        if (!(x) && pq.empty()) {
            cout << 0 << '\n';
        } else if (!(x)) {
            cout << pq.top() << '\n';
            pq.pop();
        } else {
            pq.push(x);
        }
    }
 
    return 0;
}
cs

 

 

 

 

PS 를 하다 보면

뭔가 마치 수능 보듯

유형별 풀이법을 외우면서 푸는것 같다

원래 이런건가? 라는 생각이 든다

 

 

728x90

'PS' 카테고리의 다른 글

BOJ 1697 - 숨바꼭질  (0) 2020.08.28
BOJ 1038 - 감소하는 수  (0) 2020.08.21
BOJ 2667 - 단지번호 붙이기  (0) 2020.08.18
BOJ 1012 - 유기농 배추  (0) 2020.08.18
BOJ 1764 - 듣보잡  (0) 2020.08.16