λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μ•Œκ³ λ¦¬μ¦˜ πŸ‘©πŸ»‍πŸ’»/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

#λ””μŠ€ν¬μ»¨νŠΈλ‘€λŸ¬

by flowing1ife 2023. 3. 30.
  • 문제

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

예λ₯Ό λ“€μ–΄

- 0ms μ‹œμ μ— 3msκ°€ μ†Œμš”λ˜λŠ” Aμž‘μ—… μš”μ²­
- 1ms μ‹œμ μ— 9msκ°€ μ†Œμš”λ˜λŠ” Bμž‘μ—… μš”μ²­
- 2ms μ‹œμ μ— 6msκ°€ μ†Œμš”λ˜λŠ” Cμž‘μ—… μš”μ²­

와 같은 μš”μ²­μ΄ λ“€μ–΄μ™”μŠ΅λ‹ˆλ‹€. 이λ₯Ό 그림으둜 ν‘œν˜„ν•˜λ©΄ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ μš”μ²­λ§Œμ„ μˆ˜ν–‰ν•  수 있기 λ•Œλ¬Έμ— 각각의 μž‘μ—…μ„ μš”μ²­λ°›μ€ μˆœμ„œλŒ€λ‘œ μ²˜λ¦¬ν•˜λ©΄ λ‹€μŒκ³Ό 같이 처리 λ©λ‹ˆλ‹€.

- A: 3ms μ‹œμ μ— μž‘μ—… μ™„λ£Œ (μš”μ²­μ—μ„œ μ’…λ£ŒκΉŒμ§€ : 3ms)
- B: 1msλΆ€ν„° λŒ€κΈ°ν•˜λ‹€κ°€, 3ms μ‹œμ μ— μž‘μ—…μ„ μ‹œμž‘ν•΄μ„œ 12ms μ‹œμ μ— μž‘μ—… μ™„λ£Œ(μš”μ²­μ—μ„œ μ’…λ£ŒκΉŒμ§€ : 11ms)
- C: 2msλΆ€ν„° λŒ€κΈ°ν•˜λ‹€κ°€, 12ms μ‹œμ μ— μž‘μ—…μ„ μ‹œμž‘ν•΄μ„œ 18ms μ‹œμ μ— μž‘μ—… μ™„λ£Œ(μš”μ²­μ—μ„œ μ’…λ£ŒκΉŒμ§€ : 16ms)

이 λ•Œ 각 μž‘μ—…μ˜ μš”μ²­λΆ€ν„° μ’…λ£ŒκΉŒμ§€ κ±Έλ¦° μ‹œκ°„μ˜ 평균은 10ms(= (3 + 11 + 16) / 3)κ°€ λ©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ A → C → B μˆœμ„œλŒ€λ‘œ μ²˜λ¦¬ν•˜λ©΄

- A: 3ms μ‹œμ μ— μž‘μ—… μ™„λ£Œ(μš”μ²­μ—μ„œ μ’…λ£ŒκΉŒμ§€ : 3ms)
- C: 2msλΆ€ν„° λŒ€κΈ°ν•˜λ‹€κ°€, 3ms μ‹œμ μ— μž‘μ—…μ„ μ‹œμž‘ν•΄μ„œ 9ms μ‹œμ μ— μž‘μ—… μ™„λ£Œ(μš”μ²­μ—μ„œ μ’…λ£ŒκΉŒμ§€ : 7ms)
- B: 1msλΆ€ν„° λŒ€κΈ°ν•˜λ‹€κ°€, 9ms μ‹œμ μ— μž‘μ—…μ„ μ‹œμž‘ν•΄μ„œ 18ms μ‹œμ μ— μž‘μ—… μ™„λ£Œ(μš”μ²­μ—μ„œ μ’…λ£ŒκΉŒμ§€ : 17ms)

μ΄λ ‡κ²Œ A → C → B의 μˆœμ„œλ‘œ μ²˜λ¦¬ν•˜λ©΄ 각 μž‘μ—…μ˜ μš”μ²­λΆ€ν„° μ’…λ£ŒκΉŒμ§€ κ±Έλ¦° μ‹œκ°„μ˜ 평균은 9ms(= (3 + 7 + 17) / 3)κ°€ λ©λ‹ˆλ‹€.

각 μž‘μ—…μ— λŒ€ν•΄ [μž‘μ—…μ΄ μš”μ²­λ˜λŠ” μ‹œμ , μž‘μ—…μ˜ μ†Œμš”μ‹œκ°„]을 담은 2차원 λ°°μ—΄ jobsκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, μž‘μ—…μ˜ μš”μ²­λΆ€ν„° μ’…λ£ŒκΉŒμ§€ κ±Έλ¦° μ‹œκ°„μ˜ 평균을 κ°€μž₯ μ€„μ΄λŠ” λ°©λ²•μœΌλ‘œ μ²˜λ¦¬ν•˜λ©΄ 평균이 μ–Όλ§ˆκ°€ λ˜λŠ”μ§€ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄μ£Όμ„Έμš”. (단, μ†Œμˆ˜μ  μ΄ν•˜μ˜ μˆ˜λŠ” λ²„λ¦½λ‹ˆλ‹€)

  • μ½”λ“œ
#include <string>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

struct cmp {
    bool operator()(vector<int>& a, vector<int>& b) {
        return a[1] > b[1];
    }
};

int solution(vector<vector<int>> jobs) {
    priority_queue<vector<int>, vector<vector<int>>, cmp> pq; //min heap으둜 ꡬ성
    int answer = 0;
    int current = 0; //ν˜„μž¬ μ‹œκ°„
    int cnt = 1; // μ§„ν–‰ν•œ μž‘μ—… 수

    vector<int> job; //κΈ°μ€€ μž‘μ—…

    sort(jobs.begin(), jobs.end()); // μš”μ²­ μ‹œκ°„μ΄ μž‘μ€ 순으둜 μ •λ ¬ 

    //μš”μ²­ μ‹œκ°„μ΄ κ°€μž₯ μž‘μ€ μž‘μ—…μ„ κΈ°μ€€ μž‘μ—…μœΌλ‘œ μ„€μ •
    pq.push(jobs[0]);
    current = jobs[0][0];


    while (!pq.empty()) { // pqκ°€ λΉ„μ§€ μ•Šμ„ λ•ŒκΉŒμ§€ 반볡
        //κΈ°μ€€ job μƒλŒ€λ‘œ μ†Œμš”μ‹œκ°„ 계산 ν›„ ν˜„μž¬ μ‹œκ°„ λ³€κ²½
        job = pq.top();
        pq.pop();

        answer += ((current - job[0]) + job[1]);
        current += job[1];

        //ν˜„μž¬ μ‹œκ°„λ³΄λ‹€ μš”μ²­ μ‹œκ°„μ΄ μž‘μ•˜λ˜ μž‘μ—…λ“€ λͺ¨λ‘ pq에 push
        for (; cnt < jobs.size() && jobs[cnt][0] <= current; cnt++) {
            pq.push(jobs[cnt]);
        }

        //λ§Œμ•½ ν˜„μž¬ μ‹œκ°„λ³΄λ‹€ 훨씬 λ–¨μ–΄μ§„ μ‹œκ°„μ— μž‘μ—…μ΄ μžˆλ‹€λ©΄ κΈ°μ€€ μž‘μ—… λ°”κΏˆ
        if (pq.empty() && cnt < jobs.size()) {
            current = jobs[cnt][0];
            pq.push(jobs[cnt++]);
        }
    }

    answer /= jobs.size();

    return answer;
}
  • ν•΄μ„€

1. struct cmp 

: 이쀑 λ²‘ν„°μ˜ min heap으둜 μ •λ ¬ 

 

2. solution ν•¨μˆ˜

: μž‘μ—…μ˜ μš”μ²­λΆ€ν„° μ’…λ£ŒκΉŒμ§€ κ±Έλ¦° μ‹œκ°„μ˜ 평균을 κ°€μž₯ μ€„μ΄λŠ” λ°©λ²•μœΌλ‘œ μ²˜λ¦¬ν•˜λ©΄ 평균이 μ–Όλ§ˆκ°€ λ˜λŠ”μ§€ returnν•˜λŠ” ν•¨μˆ˜

- μž‘μ—…μ΄ κ±Έλ¦¬λŠ” μ‹œκ°„μœΌλ‘œ μ •λ ¬λ˜λŠ” min heap pq μ„ μ–Έ

- 총 μž‘μ—… μ‹œκ°„μ„ μ €μž₯ν•˜λŠ” answer, ν˜„μž¬ μ‹œκ°„μ„ μ €μž₯ν•˜λŠ” current, μ§„ν–‰ν•œ μž‘μ—… 수λ₯Ό μ €μž₯ν•˜λŠ” cnt =1

- κΈ°μ€€ μž‘μ—…μ„ μ €μž₯ν•  벑터 job

- λ¨Όμ € μš”μ²­μ‹œκ°„μ΄ μž‘μ€ 순으둜 jobsλ₯Ό μ •λ ¬

- μš”μ²­ μ‹œκ°„μ΄ κ°€μž₯ μž‘μ€ μž‘μ—…μ„ κΈ°μ€€ μž‘μ—…μœΌλ‘œ 1μ°¨ μ„€μ •, ν˜„μž¬ μ‹œκ°„λ„ κΈ°μ€€ μž‘μ—…μ΄ μ‹œμž‘λ˜λŠ” μ‹œκ°„μœΌλ‘œ μ„€μ • 

- while문을 톡해 pqκ°€ λΉ„μ§€ μ•Šμ„ λ•ŒκΉŒμ§€ μ—°μ‚° 반볡

-  κΈ°μ€€ μž‘μ—…μ„ pq.top으둜 μ„€μ •ν•΄ ν˜„μž¬ μ‹œκ°„μ— μ‹œμž‘ν•  수 μžˆλŠ” μž‘μ—… 쀑 κ°€μž₯ μž‘μ—…μ΄ 빨리 λλ‚˜λŠ” μž‘μ—…μ„ κΈ°μ€€μœΌλ‘œ μ„€μ •

- answer에 ν˜„μž¬ μ‹œκ°„μ—μ„œ κΈ°μ€€ μž‘μ—…μ˜ μ‹œμž‘ μ‹œκ°„μ„ λΊ€ 값인 λŒ€κΈ° μ‹œκ°„ + μž‘μ—…μ΄ κ±Έλ¦¬λŠ” μ‹œκ°„μ„ 더함

- ν˜„μž¬ μ‹œκ°„μ— κΈ°μ€€ μž‘μ—…μ΄ κ±Έλ¦° μ‹œκ°„μ„ 더함

- 계산 μ™„λ£Œ ν›„ ν˜„μž¬ μ‹œκ°„λ³΄λ‹€ μš”μ²­ μ‹œκ°„μ΄ μž‘μ•˜λ˜ μž‘μ—…λ“€ λͺ¨λ‘ pq에 push

- λ§Œμ•½ ν˜„μž¬ μ‹œκ°„λ³΄λ‹€ 훨씬 λ–¨μ–΄μ§„ μ‹œκ°„μ— μž‘μ—…μ΄ μ‘΄μž¬ν•œλ‹€λ©΄ κΈ°μ€€ μž‘μ—…μ„ κ·Έ μž‘μ—…μœΌλ‘œ λ°”κΎΈμ–΄μ€Œ

- answer의 값을 jobs의 μ‚¬μ΄μ¦ˆλ‘œ λ‚˜λˆ„μ–΄ 평균을 ꡬ함