Computer Science
탄탄한 기반 실력을 위한
전공과 이론 지식 모음
Today I Learned!
배웠으면 기록을 해야지
TIL 사진
Flutter 사진
Flutter로 모바일까지
거꾸로캠퍼스 코딩랩 Flutter 앱개발 강사
스파르타코딩클럽 즉문즉답 튜터
카카오테크캠퍼스 3기 학습코치
프로필 사진
박성민
임베디드 세계에
발을 들인 박치기 공룡
임베디드 사진
EMBEDDED SYSTEM
임베디드 SW와 HW, 이론부터 실전까지
ALGORITHM
알고리즘 해결 전략 기록
🎓
중앙대학교 소프트웨어학부
텔레칩스 차량용 임베디드 스쿨 3기
애플 개발자 아카데미 1기
깃허브 사진
GitHub
프로젝트 모아보기
Instagram
인스타그램 사진

Develop/알고리즘

[백준 ] 11279 - 최대 힙

sm_amoled 2022. 3. 4. 01:41

문제링크

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

문제

널리 잘 알려진 자료구조 중 최대 힙이 있다. 최대 힙을 이용하여 다음과 같은 연산을 지원하는 프로그램을 작성하시오.

  1. 배열에 자연수 x를 넣는다.
  1. 배열에서 가장 큰 값을 출력하고, 그 값을 배열에서 제거한다.

프로그램은 처음에 비어있는 배열에서 시작하게 된다.

입력

첫째 줄에 연산의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0이라면 배열에서 가장 큰 값을 출력하고 그 값을 배열에서 제거하는 경우이다. 입력되는 자연수는 231보다 작다.

출력

입력에서 0이 주어진 회수만큼 답을 출력한다. 만약 배열이 비어 있는 경우인데 가장 큰 값을 출력하라고 한 경우에는 0을 출력하면 된다.

조건

  • 시간 제한 : 1s
  • 메모리 제한 : 256MB

해설

우선순위 큐(priority_queue)를 이용해주면 간단하게 해결할 수 있는 문제이다. 우선순위 큐는 push 한 원소들을 자동으로 정렬하여 push와 동시에 큰 값이 가장 앞으로 오게 원소들을 내림차순으로 정렬해준다.

사용하는 연산은 pq.top(), pq.push(v), pq.pop(), pq.emtpy()을 사용해주면 된다.

풀이

priority_queue 자료구조는 queue 헤더파일에 있으므로, 해당 헤더를 불러와준다.

priority_queue<int> pq;

void pushPQ(int v) {
    pq.push(v);
}

void popPQ() {
    if(pq.empty()) {
        cout << 0 << '\n';
    } else {
        cout << pq.top() << '\n';
        pq.pop();
    }
}

우선순위 큐에 push 할 때는 그냥 push 해주면 된다.

Pop할 때, 원소가 없으면 0을 출력하고, 원소가 있으면 해당 값을 출력한 뒤 pop을 한다. 이를 위해 현재 pq가 비어있는지를 확인하는 함수인 pq.empty()를 사용해주었다.

아래처럼 코드를 작성해 실행해주면 간단히 원하는 결과를 얻을 수 있다.

int N;
cin >> N;

for(int i = 0; i < N; i++) {
    int k;
    cin >> k;
    if(k == 0) popPQ();
    else pushPQ(k);
}

코멘트

EZ!


코드

#include <iostream>
#include <queue>

#define FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);

using namespace std;

priority_queue<int> pq;

void pushPQ(int v) {
    pq.push(v);
}

void popPQ() {
    if(pq.empty()) {
        cout << 0 << '\n';
    } else {
        cout << pq.top() << '\n';
        pq.pop();
    }
}


int main() {
    FAST;
    
    int N;
    cin >> N;
    
    for(int i = 0; i < N; i++) {
        int k;
        cin >> k;
        if(k == 0) popPQ();
        else pushPQ(k);
    }
    
    return 0;
}
320x100

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

[백준 ] 2667 - 단지번호붙이기  (0) 2022.03.04
[백준 ] 2178 - 미로 탐색  (0) 2022.03.04
[백준] 2525 - 오븐 시계  (0) 2022.03.04
[백준] 2836 - 수상 택시  (0) 2022.01.04
[백준] 3392 - 화성지도  (0) 2022.01.04