알고리즘/문제 풀이

백준 1927 - 최소 힙

qqlzzb 2022. 3. 20. 23:11

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

 

1927번: 최소 힙

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

www.acmicpc.net

풀이

key 값이 오름차순으로 자동 정렬되는 map을 사용했다. 일반 map의 경우 중복이 제거되므로, 중복이 제거되지 않는 multimap으로 문제를 해결했다.

 

map이 비어있지 않고, 0이 입력되면 map의 맨 처음에 있는 값을 출력한 후, 그 값을 지우고, map이 비어있는데 0이 입력되면 0을 출력한다. 입력값이 0이 아니라면 map에 입력받은 수를 추가한다.

 

코드

#include <iostream>
#include <map>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
    multimap<long,int> m1;

    int n;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        long a;
        cin>>a;
        if(a==0 && !m1.empty()) 
        {
            cout<<m1.begin()->first<<'\n'; 
            m1.erase(m1.begin());
        }
        else if(a==0 && m1.empty()) cout<<"0"<<'\n';
        else m1.insert({a,i});
    }
}

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

백준 13015 - 별 찍기 - 23(C++)  (0) 2022.03.22
백준 1929 - 소수 구하기(C++)  (0) 2022.03.21
백준 1065 - 한수  (0) 2022.03.19
백준 1158 - 요세푸스 문제(C++)  (0) 2022.03.12
백준 4949 - 균형잡힌 세상  (0) 2022.03.03