λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm🐰/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] C++ λ””μŠ€ν¬ 컨트둀러

by Jouureee 2022. 4. 22.

문제 :

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

 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - λ””μŠ€ν¬ 컨트둀러

ν•˜λ“œλ””μŠ€ν¬λŠ” ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ μž‘μ—…λ§Œ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ””μŠ€ν¬ 컨트둀러λ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법은 μ—¬λŸ¬ 가지가 μžˆμŠ΅λ‹ˆλ‹€. κ°€μž₯ 일반적인 방법은 μš”μ²­μ΄ λ“€μ–΄μ˜¨ μˆœμ„œλŒ€λ‘œ μ²˜λ¦¬ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 예λ₯Ό

programmers.co.kr

 

풀이 :

λ””μŠ€ν¬ μŠ€μΌ€μ€„λ§ν•˜λŠ” λ¬Έμ œμ˜€λ‹€.

input으둜 [[0,3], [1, 9], [2, 6]] (μš”μ²­ μ‹œκ°„, μž‘μ—… μ†Œμš” μ‹œκ°„)이 μ£Όμ–΄μ‘Œμ„λ•Œ 

이듀을 κ°€μž₯ 짧게 μž‘μ—…μ„ λλ‚΄λŠ” μ‹œκ°„ / 3 ν•˜μ—¬ 평균 μ‹œκ°„μ„ κ΅¬ν•΄μ£ΌλŠ” λ¬Έμ œμ˜€λ‹€.

 

μš°μ„ μ€ μž‘μ—… μ†Œμš” μ‹œκ°„μ΄ 짧은 것을 λ¨Όμ € μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄μ„œ μš°μ„ μˆœμœ„νλ₯Ό μ‚¬μš©ν–ˆλ‹€.

μž‘μ—…μ€ μš”μ²­μ‹œκ°„μ΄ 짧은 순으둜 sorting ν•œλ‹€.

그리고 μž‘μ—…μ„ λͺ¨λ‘ λŒλ•ŒκΉŒμ§€ && queue에 μžˆλŠ” μ›μ†Œλ₯Ό λ‹€ μ²˜λ¦¬ν•΄μ„œ κ³„μ‚°ν• λ•ŒκΉŒμ§€ λ°˜λ³΅ν•˜μ—¬ μˆ˜ν–‰ν•œλ‹€.

μš°μ„  ν˜„μž¬μ‹œκ°„μ€ μž‘μ—…μ˜ μ†Œμš” μ‹œκ°„μœΌλ‘œ λˆ„μ λœλ‹€.

[0,3] -> [2,6] -> [1, 9]으둜 μž‘μ—…μ΄ μžˆμ„λ•Œ 

curTime = 3 + 6 + 9 순으둜 λˆ„μ λœλ‹€. λ”°λΌμ„œ ν˜„μž¬ μ‹œκ°„ μ•ˆμ—μ„œ μš”μ²­λ˜λŠ” μž‘μ—…μ΄ μžˆμ„ κ²½μš°μ— pq에 λ„£μ–΄μ€€λ‹€. 

κ·Έλ ‡κ²Œ ν˜„μž¬ μ‹œκ°„ μ•ˆμ—μ„œ μš”μ²­λ˜λŠ” μž‘μ—…λ“€μ„ λͺ¨λ‘ pq에 넣어놓고

pqμ—μ„œ popν•˜λ©° μž‘μ—… μ‹œκ°„μ„ 계산할 것이닀.

ν˜„μž¬ μ‹œκ°„μ€ μ•„κΉŒ λ§ν–ˆλ˜ κ²ƒμ²˜λŸΌ μž‘μ—… μ‹œκ°„μ˜ λˆ„μ μ΄λ©°

curTime += pq.top()[1]

 

answer은 ν˜„μž¬ μ‹œκ°„μ—μ„œ μ€‘λ³΅λœ μš”μ²­ μ‹œκ°„μ„ 빼쀀채 λˆ„μ ν•œλ‹€.

answer += curTime - pq.top()[0]

 

pqκ°€ λΉ„μ–΄μžˆλ‹€λ©΄ ν˜„μž¬ μ‹œκ°„ μ•ˆμ—μ„œ μˆ˜ν–‰ν•  μž‘μ—…μ΄ μ—†λ‹€λŠ” κ²ƒμœΌλ‘œ λ‹€μŒ μž‘μ—…μœΌλ‘œ curTime을 λ°”κΏ”μ€€λ‹€.

 

C++ μ½”λ“œ :

#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

struct compare
{	//μ˜€λ¦„μ°¨μˆœ
    bool operator()(const vector<int>& v1, const vector<int>& v2)
    {
        return v1[1] > v2[1];
    }
};

int solution(vector<vector<int>> jobs) {
    int answer = 0;
    int taskCnt = 0;
    int curTime = 0;
    priority_queue<vector<int>, vector<vector<int>>, compare> pq;
    
    sort(jobs.begin(), jobs.end()); // μž‘μ—… μ†Œμš”μ‹œκ°„ 짧은 순으둜 μ •λ ¬
    while(taskCnt < jobs.size() || !pq.empty()){
        if (taskCnt < jobs.size() && jobs[taskCnt][0] <= curTime) {
            //μš”μ²­λ˜λŠ” μž‘μ—… μ‹œκ°„μ΄ ν˜„μž¬ μ‹œκ°„λ³΄λ‹€ μž‘μ•„μ•Ό μž‘μ—… μˆ˜ν–‰ κ°€λŠ₯
            pq.push(jobs[taskCnt++]);
            continue;
        }
        if(!pq.empty()) {
            curTime += pq.top()[1]; //μ†Œμš” μ‹œκ°„
            answer += curTime - pq.top()[0]; //μš”μ²­ μ‹œμ 
            pq.pop();
        }else {
           	// curTime > job[taskCnt] && pq λΉ„μ–΄ μžˆλŠ” 경우
            // 즉 κ²ΉμΉ˜μ§€ μ•ŠλŠ” 경우
            curTime = jobs[taskCnt][0];
        }
    }
    return answer/jobs.size();
}

κ²°κ³Ό :

λŒ“κΈ€