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

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

meeeeejin 2020. 7. 24. 22:27

문제

 

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

 

예λ₯Ό λ“€μ–΄

- 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 ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄μ£Όμ„Έμš”. (단, μ†Œμˆ˜μ  μ΄ν•˜μ˜ μˆ˜λŠ” λ²„λ¦½λ‹ˆλ‹€)

 

<μ œν•œ 사항>

  • jobs의 κΈΈμ΄λŠ” 1 이상 500 μ΄ν•˜μž…λ‹ˆλ‹€.
  • jobs의 각 행은 ν•˜λ‚˜μ˜ μž‘μ—…μ— λŒ€ν•œ [μž‘μ—…μ΄ μš”μ²­λ˜λŠ” μ‹œμ , μž‘μ—…μ˜ μ†Œμš”μ‹œκ°„] μž…λ‹ˆλ‹€.
  • 각 μž‘μ—…μ— λŒ€ν•΄ μž‘μ—…μ΄ μš”μ²­λ˜λŠ” μ‹œκ°„μ€ 0 이상 1,000 μ΄ν•˜μž…λ‹ˆλ‹€.
  • 각 μž‘μ—…μ— λŒ€ν•΄ μž‘μ—…μ˜ μ†Œμš”μ‹œκ°„μ€ 1 이상 1,000 μ΄ν•˜μž…λ‹ˆλ‹€.
  • ν•˜λ“œλ””μŠ€ν¬κ°€ μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ³  μžˆμ§€ μ•Šμ„ λ•Œμ—λŠ” λ¨Όμ € μš”μ²­μ΄ λ“€μ–΄μ˜¨ μž‘μ—…λΆ€ν„° μ²˜λ¦¬ν•©λ‹ˆλ‹€.

 

문제 μ£Όμ†Œ: https://programmers.co.kr/learn/courses/30/lessons/42627

 

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

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

programmers.co.kr

 

 

 

λ¬Έμ œν’€μ΄

 

전에 ν’€μ—ˆλ˜ 라면곡μž₯ λ¬Έμ œμ™€ μœ μ‚¬ν•œ 문제인데, μš°μ„ μˆœμœ„ 큐의 비ꡐ 기쀀을 μ •μ˜ν•΄μ€˜μ•Ό ν•œλ‹€λŠ” μ μ—μ„œ μ•½κ°„ 더 μ–΄λ €μš΄ λ¬Έμ œμž…λ‹ˆλ‹€. 

 

 

 

μš°μ„  jobsλ₯Ό μž‘μ—… μš”μ²­ μ‹œμ μ΄ λΉ λ₯Έ μˆœμ„œλŒ€λ‘œ μ •λ ¬ν•©λ‹ˆλ‹€. 그리고 μž‘μ—…μ„ λͺ¨λ‘ μ²˜λ¦¬ν•  λ•ŒκΉŒμ§€ λ‹€μŒμ„ λ°˜λ³΅ν•©λ‹ˆλ‹€. μ΄λ•Œ, μš°μ„ μˆœμœ„ 큐에 λͺ¨λ“  μž‘μ—…μ„ λ„£μ—ˆκ³  큐가 λΉ„μ—ˆμ„ 경우 μž‘μ—…μ„ λͺ¨λ‘ μ²˜λ¦¬ν•œ κ²ƒμž…λ‹ˆλ‹€. 

 

1. ν˜„μž¬ μ‹œκ°λ³΄λ‹€ μž‘μ—… μš”μ²­ μ‹œμ μ΄ λΉ λ₯Έ μž‘μ—…μ„ λͺ¨λ‘ μš°μ„ μˆœμœ„ 큐에 μ‚½μž…

2-1. μˆ˜ν–‰ν•  μž‘μ—…μ΄ μžˆλŠ” 경우

     1) ν˜„μž¬ μ‹œκ°μ— μž‘μ—…μ˜ μ†Œμš” μ‹œκ°„μ„ 더함

     2) answer에 μž‘μ—… μš”μ²­μ—μ„œ μ’…λ£ŒκΉŒμ§€ μ‹œκ°„(ν˜„μž¬ μ‹œκ° - μž‘μ—… μš”μ²­ μ‹œμ )을 더함

     3) μš°μ„ μˆœμœ„ νμ—μ„œ μž‘μ—… μ‚­μ œ

2-2. μˆ˜ν–‰ν•  μž‘μ—…μ΄ μ—†λŠ” 경우

     1) ν˜„μž¬ μ‹œκ°μ„ λ‹€μŒ μž‘μ—…μ΄ λ“€μ–΄μ˜€λŠ” μ‹œκ°μœΌλ‘œ λ³€κ²½

 

 

 

 

 

μ†ŒμŠ€μ½”λ“œ

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// λ””μŠ€ν¬ μ»¨νŠΈλ‘€λŸ¬
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
 
using namespace std;
 
// μž‘μ—…μ˜ μ†Œμš” μ‹œκ°„이 μ§§μ€ μˆœμœΌλ‘œ μ •λ ¬ν•˜κΈ° μœ„ν•œ λΉ„ꡐ κ΅¬μ‘°μ²΄
struct compare {
    bool operator()(vector<int> a, vector<int> b) {
        return a[1> b[1];
    }
};
 
int solution(vector<vector<int>> jobs) {
    int answer = 0;
    priority_queue<vector<int>vector<vector<int>>, compare> pq;
    int time = 0;   // ν˜„μž¬ μ‹œκ°
    int idx = 0;   // μš°μ„ μˆœμœ„ νμ— λ“€μ–΄κ°„ μž‘μ—…μ˜ κ°œμˆ˜
    sort(jobs.begin(), jobs.end()); // μž‘업이 μš”μ²­λ˜λŠ” μ‹œμ μ΄ λΉ λ₯Έ μˆœμœΌλ‘œ μ •λ ¬
 
    while (idx < jobs.size() || !pq.empty()) {
        // ν˜„μž¬ μˆ˜ν–‰ν•  μˆ˜ μžˆλŠ” μž‘업을 λͺ¨λ‘ μš°μ„ μˆœμœ„ νμ— λ„£λŠ”λ‹€
        if (idx < jobs.size() && jobs[idx][0<= time) {
            pq.push(jobs[idx++]);
            continue;
        }
 
        // μˆ˜ν–‰ν•  μž‘업이 μžˆλŠ” κ²½μš°
        if (!pq.empty()) {
            time += pq.top()[1];
            answer += time - pq.top()[0];
            pq.pop();
        }
        // μˆ˜ν–‰ν•  μž‘업이 μ—†λŠ” κ²½μš°
        else {
            // λ‹€μŒ μž‘업이 λ“€μ–΄μ˜€λŠ” μ‹œκ°μœΌλ‘œ λ³€κ²½
            time = jobs[idx][0];
        }
    }  
 
    return answer/jobs.size();  // ν‰κ·  μ‹œκ°„ λ°˜ν™˜
}
cs

 

 

 

 

 

κ³΅λΆ€ν•œ 것을 μ •λ¦¬ν•œ λ‚΄μš©μž…λ‹ˆλ‹€. μˆ˜μ •ν•  뢀뢄이 μžˆλ‹€λ©΄ μ•Œλ €μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€ :)

 

 

728x90