이 영역을 누르면 첫 페이지로 이동
hoonDEV 블로그의 첫 페이지로 이동

hoonDEV

페이지 맨 위로 올라가기

hoonDEV

BOJ 11286 - 절댓값 힙 문제풀이

  • 2020.03.19 23:09
  • 알고리즘/문제풀이

문제를 읽고 이해하기

절댓값 힙은 다음과 같은 연산을 지원하는 자료구조이다.

  1. 배열에 정수 x (x ≠ 0)를 넣는다.
  2. 배열에서 절댓값이 가장 작은 값을 출력하고, 그 값을 배열에서 제거한다. 절댓값이 가장 작은 값이 여러개일 때는, 가장 작은 수를 출력하고, 그 값을 배열에서 제거한다.

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

 

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

 

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

 

재정의와 추상화

절댓값이 '작은' 순서대로 출력한다는 점에 착안하여 우선순위 큐를 이용하여 문제를 풀 것이다.

우선순위 큐를 선언을 priority_queue<pair<int, int>, vector<pair<int, int>>, cmp> pq;로 했다. pair의 first는 절댓값을 넣고 second는 실제 값을 넣는다.

그리고 cmp를 통해 절댓값이 '작은' 순서대로, 만약 절댓값이 같을 경우, 실제 값이 더 작은 것(음수)을 우선으로 정렬되게 하였다.

이 외에는 문제에서 말한대로 구현하였다.

 

코드 작성

#include <iostream>
#include <utility>
#include <queue>
#include <cmath>
using namespace std;

class cmp {
public:
    bool operator()(pair<int, int> a, pair<int, int> b) {
        if (a.first == b.first)
            return a.second > b.second;
        return a.first > b.first;
    }
};
int main() {
    cin.sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    priority_queue<pair<int, int>, vector<pair<int, int>>, cmp> pq;
    int n;
    cin >> n;

    while (n--) {
        int x;
        cin >> x;

        if (x == 0) {
            if (pq.empty()) {
                cout << 0 << '\n';
                continue;
            }
            cout << pq.top().second << '\n';
            pq.pop();
        } else
            pq.push(make_pair(abs(x), x));
    }

    return 0;
}

 

회고하기

C++ STL의 우선순위 큐만 이용할 줄 알면 별로 어려울 것이 없는 문제였다. 다만, priority_queue의 <> 내부의 3번째에 전달되는 cmp를 사용하는 것은 처음이었기 때문에 서핑을 통해 알아낼 수 밖에 없었다.

 

https://coding-insider.tistory.com/entry/sort-%EC%82%AC%EC%9A%A9%EB%B2%95-priorityqueue%EC%97%90%EC%84%9C%EC%9D%98-sort-%EC%B0%A8%EC%9D%B4

 

sort 사용법 + priority_queue에서의 sort 방식 차이

#include sort https://blockdmask.tistory.com/178 [C++] sort algorithm 정리 및 예시 안녕하세요 BlockDMask 입니다. 오늘은 C++ STL 에서 제공하는 알고리즘 중에 sort 알고리즘에 대해 알아보겠습..

coding-insider.tistory.com

이 곳을 참고하여 복습하도록 하자!

'알고리즘 > 문제풀이' 카테고리의 다른 글

BOJ 1427 - 소트인사이드 문제풀이  (0) 2020.03.25
BOJ 1181 - 단어 정렬 문제풀이  (0) 2020.03.25
BOJ 1026 - 보물 문제풀이  (0) 2020.03.25
BOJ 1010 - 다리 놓기 문제풀이  (0) 2020.03.19
BOJ 2630 - 색종이 만들기 문제풀이  (0) 2020.03.18

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • BOJ 1181 - 단어 정렬 문제풀이

    BOJ 1181 - 단어 정렬 문제풀이

    2020.03.25
  • BOJ 1026 - 보물 문제풀이

    BOJ 1026 - 보물 문제풀이

    2020.03.25
  • BOJ 1010 - 다리 놓기 문제풀이

    BOJ 1010 - 다리 놓기 문제풀이

    2020.03.19
  • BOJ 2630 - 색종이 만들기 문제풀이

    BOJ 2630 - 색종이 만들기 문제풀이

    2020.03.18
다른 글 더 둘러보기

정보

hoonDEV 블로그의 첫 페이지로 이동

hoonDEV

  • hoonDEV의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그

카테고리

  • 분류 전체보기 (91)
    • 일상 (13)
      • 후기 (1)
      • 계획 (11)
    • 공지사항 (1)
    • 알고리즘 (54)
      • 문제풀이 (53)
      • 이론 (1)
    • 공부 (19)
      • React (0)
      • Angular (5)
      • Java (3)
      • C, C++ (3)
      • JavaScript (6)
      • WEB (2)
    • 디자인 (1)
      • UI, UX (1)
    • 개발 (0)
      • boom (0)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • javascript
  • 이분탐색
  • 그리디
  • dp
  • 문제풀이
  • es6
  • 백준
  • 알고리즘

나의 외부 링크

정보

훈개발자의 hoonDEV

hoonDEV

훈개발자

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © 훈개발자. Designed by Fraccino.

티스토리툴바