자기개발👨‍💻/코딩 알고리즘

[C++] 프로그래머스 더 맵게

천숭이 2022. 3. 13. 23:19

https://programmers.co.kr/learn/courses/30/lessons/42626

#include <queue>
#include <vector>
#include <iostream>
using namespace std;

int solution(vector<int> s, int K) {
    int answer = 0;
    priority_queue<int, vector<int>, greater<int> > pq(s.begin(), s.end());  // 오름차순 자동정렬 큐
    int length = pq.size();
    int tmp;
    while(pq.size()>1 && pq.top() < K){
        tmp = pq.top();     pq.pop();
        tmp += 2*pq.top();  pq.pop();
        pq.push(tmp);
        answer++;
    }
    if (pq.top()<K) return -1;
    return answer;
}

- 무조건 큐 자료구조를 써야하는 문제, 그렇지 않으면 시간초과 발생

- 이걸 모른 상태에서 계속해서 문제 시도 + 큐 자료구조 배우는데 걸리는 시간 = 시간 많이 쏟음

- queue라이브러리를 선언하고 priority_queue 자료형을 이용해 pq라는 큐를 선언

- 이때 greater라는 옵션을 줘서 오름차순|자동정렬 큐 생성

- 주어지는 s벡터의 값을 넣어줘야 하므로 끝에 pq(s.begin(), s.end()) 작성

- [1, 2, 3, 9, 10, 12] 이렇게 주어지면 pq.top()은 1이다. 따라서 pop해주면 최소값 날라가고 새로운 최소값이 top이 되는 구조.

- pq.push(tmp)를 하면 값이 추가되면서 자동으로 정렬이 되는 신기한 자료구조