๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/Programmers

[C++/PGS] Lv.3 : ๋””์Šคํฌ ์ปจํŠธ๋กค๋Ÿฌ (Heap/priority_queue)

xxilliant 2025. 4. 17. 14:17
728x90
๋ฐ˜์‘ํ˜•

 

https://school.programmers.co.kr/learn/courses/30/lessons/42627#

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

SW๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ‰๊ฐ€, ๊ต์œก, ์ฑ„์šฉ๊นŒ์ง€ Total Solution์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฒ ์ด์Šค์บ ํ”„

programmers.co.kr


ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ ˆ๋ฒจ 3.

SJF ์Šค์ผ€์ค„๋ง ๊ธฐ๋ฒ•์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค!

์ƒ๊ฐ๋ณด๋‹ค ๊นŒ๋‹ค๋กญ๊ณ , ํž™ ์ •๋ ฌ ์ปค์Šคํ…€ ๊ด€๋ จํ•œ ๋ฌธ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•ด์„œ ์•ฝ๊ฐ„ ์–ด๋ ค์› ๋‹ค

 

์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ์„œ ์ž๋™ ์ •๋ ฌ์ด ๋˜์–ด์•ผํ•˜๋Š”๋ฐ, ๊ทธ๋ž˜์„œ ์ฒ˜์Œ์—๋Š” ์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•œ Map์œผ๋กœ ํ’€๋‹ค๊ฐ€

์‹œ๊ฐ„์ด ๋ ๋•Œ๋งˆ๋‹ค ๊ฐ€๋Šฅํ•œ ์ž‘์—…์„ ์‚ฝ์ž…ํ•ด์ฃผ๋Š” ํ˜•์‹์ด ๋งž๋‹ค๋Š” ๊ฑธ ๊นจ๋‹ฌ์•„์„œ Queue๋กœ ๋ฐ”๊พธ์—ˆ๋‹ค.

 

์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์‚ฌ์šฉํ•ด์„œ, ํ•ด๋‹น ์‹œ๊ฐ„์ด ๋  ๋•Œ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ๊ธฐ์ค€์— ๋งž๊ฒŒ ์ •๋ ฌํ•ด์•ผ ํ•œ๋‹ค!

๋ฐ์ดํ„ฐ ํฌ๊ธฐ๋‚˜ ์‹œ๊ฐ„ ๊ฐ’์— ๋Œ€ํ•œ ์กฐ๊ฑด ๋“ฑ์ด ๊ทธ๋ ‡๊ฒŒ ํฌ์ง€ ์•Š์•„์„œ,

๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฆด ๋•Œ๋งˆ๋‹ค 1์ดˆ์”ฉ ํ๋ฅธ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ํ’€์—ˆ๋‹ค.

 

 

priority_queue๋ฅผ ์„ ์–ธํ•  ๋•Œ,

์ผ๋ฐ˜์ ์ธ ์ตœ๋Œ€ ํž™ ์‚ฌ์šฉ ์‹œ์—๋Š” "priority_queue<vector<int>>" ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š”๋ฐ

 

์ตœ์†Œ ํž™์„ ์“ธ ๋•Œ๋‚˜ ์ •๋ ฌํ•จ์ˆ˜๋ฅผ ์ปค์Šคํ…€ํ•˜๋ ค๋ฉด

"priority_queue<vector<int>, vector<vector<int>>, compare>"

์ด๋ ‡๊ฒŒ ๋ณต์žกํ•˜๊ฒŒ ์จ์•ผํ•˜๋Š” ๊ฑธ ์ฒ˜์Œ ์•Œ์•˜๋‹ค.

 

์™œ ๊ทธ๋Ÿฌ๋‚˜ ํ–ˆ๋”๋‹ˆ, ๊ฐ’์„ ๋‹ด์•„์„œ ์ •๋ ฌํ•  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•„์š”ํ•œ ๊ฑฐ์˜€๋‹ค,,, ใ…Ž.ใ…Ž

๊ธฐ์–ตํ•ด๋‘๊ธฐ!!

 

 

๋‚˜์˜ ํ’€์ด

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

struct cmp{
    bool operator()(vector<int> &a, vector<int> &b){
        if(a[0]==b[0]) return a[1] > b[1];
        return a[0] > b[0];
    }
    // ๋ฐ”๊ฟ€๋ž˜?๋ผ๊ณ  ๋ฌผ์„ ๋•Œ, true -> ๋ฐ”๊พผ๋‹ค
};

int solution(vector<vector<int>> jobs) { // [์š”์ฒญ ์‹œ๊ฐ, ์†Œ์š”์‹œ๊ฐ„]
    // ๋น„์„ ์  sjf
    int answer = 0;
    vector<int> returnTime;
    priority_queue<vector<int>, vector<vector<int>>, cmp> schedule;
    // ์†Œ์š”์‹œ๊ฐ„, ์š”์ฒญ์‹œ๊ฐ„ - cmp ์ •๋ ฌ ํ•จ์ˆ˜ ์‚ฌ์šฉ
    sort(jobs.begin(), jobs.end());
    
    int time = 0; // ํ˜„์žฌ ์‹œ๊ฐ„
    int index = 0; // jobs ์ธ๋ฑ์Šค
    int isRunning = 0;
    while(!schedule.empty() || index < jobs.size()){
        // 1. ์‹œ๊ฐ„์ด ๋ ๋•Œ๋งˆ๋‹ค ํ์— ์‚ฝ์ž…
        if(index < jobs.size() && time >= jobs[index][0]){
            vector<int> v;
            v.push_back(jobs[index][1]); v.push_back(jobs[index][0]);
            schedule.push(v);
            index++;
        }
        // 2. ์‹คํ–‰์ค‘์ธ ์ƒํƒœ๊ฐ€ ์•„๋‹ ๋•Œ, ํ top์„ ๊บผ๋‚ด์„œ ์‹คํ–‰
        if(isRunning==0 && !schedule.empty()){
            vector<int> v = schedule.top();
            schedule.pop();
            // ๋ฐ˜ํ™˜์‹œ๊ฐ„ = ์ข…๋ฃŒ ์‹œ๊ฐ - ์š”์ฒญ ์‹œ๊ฐ
            returnTime.push_back(time+v[0]-v[1]);
            // cout << time+v[0]-v[1]<<"\n";
            isRunning = v[0]; // ์†Œ์š”์‹œ๊ฐ„ ๋™์•ˆ true์ธ ์ƒํƒœ
        }
        time++;
        if(isRunning>0) isRunning--;
    }
    for(int n:returnTime){
        answer += n;
    }
    answer /= returnTime.size();
    return answer;
}

728x90
๋ฐ˜์‘ํ˜•