ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] 명예의 전당(1) c++
    Coding Test/programmers 2023. 1. 17. 19:15
    728x90

    문제 설명

    "명예의 전당"이라는 TV 프로그램에서는 매일 1명의 가수가 노래를 부르고, 시청자들의 문자 투표수로 가수에게 점수를 부여합니다. 매일 출연한 가수의 점수가 지금까지 출연 가수들의 점수 중 상위 k번째 이내이면 해당 가수의 점수를 명예의 전당이라는 목록에 올려 기념합니다. 즉 프로그램 시작 이후 초기에 k일까지는 모든 출연 가수의 점수가 명예의 전당에 오르게 됩니다. k일 다음부터는 출연 가수의 점수가 기존의 명예의 전당 목록의 k번째 순위의 가수 점수보다 더 높으면, 출연 가수의 점수가 명예의 전당에 오르게 되고 기존의 k번째 순위의 점수는 명예의 전당에서 내려오게 됩니다.

    이 프로그램에서는 매일 "명예의 전당"의 최하위 점수를 발표합니다. 예를 들어, k = 3이고, 7일 동안 진행된 가수의 점수가 [10, 100, 20, 150, 1, 100, 200]이라면, 명예의 전당에서 발표된 점수는 아래의 그림과 같이 [10, 10, 10, 20, 20, 100, 100]입니다.

    제한 사항

    • 3 ≤ k ≤ 100
    • 7 ≤ score의 길이 ≤ 1,000
      • 0 ≤ score[i] ≤ 2,000

    입출력 예

    k score result
    3 [10, 100, 20, 150, 1, 100, 200] [10, 10, 10, 20, 20, 100, 100]
    4 [0, 300, 40, 300, 20, 70, 150, 50, 500, 1000] [0, 0, 0, 0, 20, 40, 70, 70, 150, 300]

    풀이

    우선순위 큐인 priority_queue를 사용하여 푼 풀이입니다.

    큐는 FIFO 으로, 맨 먼저 들어온 요소가 top이 됩니다. 정렬값을 지정하지 않으면 기본 값으로 bottm to top 방향으로 오름차순 정렬하게 되어 top에 최댓 값이 들어있습니다.

     

    top에 최소 값이 들어있도록 저장하기 위해서 bottom to top 방향으로 내림차순 정렬하기 위해 vector컨테이너의 greater<int>방식을 설정합니다.

    #include <string>
    #include <vector>
    #include <algorithm>
    #include <queue>
    
    using namespace std;
    
    vector<int> solution(int k, vector<int> score) {
        vector<int> answer;
        priority_queue<int, vector<int>, greater<int>> pq;
        for(int i = 0; i < score.size(); i++){
            if(pq.size() < k){
                pq.push(score[i]);
                answer.push_back(pq.top());
            }
            else{
                int nk = pq.top();
                if( nk <= score[i]){
                     pq.push(score[i]);
                     pq.pop();
                     nk = pq.top();    
                }
                answer.push_back(nk);
            }
        }
        
        return answer;
    }

     

     

    다른 풀이

    vector의 sort를 이용한 풀이입니다.

    vector를 오름차순으로 정렬하여 최솟값인 첫번째 요소를 접근하는 것 보다

    vector를 내림차순으로 정렬하여 최솟값인 마지막 요소를 접근하는 것이 원소를 삭제하기 더 빠르다.

    vector<int> solution(int k, vector<int> score) {
        vector<int> answer, tmp;
        for(auto s : score){
            tmp.push_back(s);
            sort(tmp.begin(), tmp.end(), greater<int>());
            if(tmp.size() >= k) tmp.erase(tmp.begin() + k, tmp.end());
            answer.push_back(tmp.back());
        }
    
        return answer;
    }
    728x90

    댓글

© 2022. code-space ALL RIGHTS RESERVED.