

ํด๋น ๊ฒ์๋ฌผ์ [Programmers/javascript] ๋์คํฌ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐธ๊ณ ํ์ฌ ์์ฑ๋์์์ ๋ฏธ๋ฆฌ ๋ฐํ๋๋ค.
ํ๋๋์คํฌ๋ ํ ๋ฒ์ ํ๋์ ์์ ๋ง ์ํํ ์ ์์ต๋๋ค. ๋์คํฌ ์ปจํธ๋กค๋ฌ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค. ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ์์ฒญ์ด ๋ค์ด์จ ์์๋๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋๋ค.
์๋ฅผ๋ค์ด
- 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 | return | 
|---|---|
| [[0, 3], [1, 9], [2, 6]] | 9 | 
์ ์ถ๋ ฅ ์ ์ค๋ช
๋ฌธ์ ์ ์ฃผ์ด์ง ์์ ๊ฐ์ต๋๋ค.
๋ฌธ์ ๊ฐ ์ ์ํ๋ฆฐ๋ค๋ฉด๐ข
ํํธ๊ฐ ํ์ํ๊ฐ์? [์ฝ๋ฉํ ์คํธ ์ฐ์ต ํํธ ๋ชจ์์ง]์ผ๋ก ์ค์ธ์! โ ํด๋ฆญ
function solution(jobs) {
    // job์ ์์๋๋ก ์ ๋ ฌ
    jobs.sort((a,b) => a[0] - b[0])
    // ์ ๋ต ์๊ฐ
    let answer = 0
    // ๋์คํฌ ํ
    const queue = []
    const len = jobs.length
    let i = 0
    let cur = 0
    // ๋์คํฌ๊ฐ ๋จ๊ฑฐ๋ ๋์คํฌ ํ์ ์์ฌ ๋์คํฌ๊ฐ ์๋ ๊ฒฝ์ฐ
    while(i < len || queue.length > 0) {
        // ํ์์ ๊ณผ ๊ฐ๊ฑฐ๋ ์ด์  ์์
๋ค์ ๋ชจ๋ ํ์ ์
๋ ฅ
        if(i < len && jobs[i][0] <= cur) {
            queue.push(jobs[i++])
            continue
        }
        // ์คํ์ด ๊ฐ๋ฅํ ๋์คํฌ ํ ์ค ์คํ์๊ฐ์ ๋ฐ๋ฅธ ์ค๋ฆ์ฐจ ์ ์ ๋ ฌ
        queue.sort((a,b) => a[1]-b[1])
        // ํ์ ๋์คํฌ๊ฐ ์๋ค๋ฉด
        if(queue.length > 0) {
            const job = queue.shift()
            // ๋๋ ์๊ฐ์ ํ ์๊ฐ์ ๋ํ๊ณ 
            cur += job[1]
            // ๋๊ธฐํ ์๊ฐ ์ ๊ฑฐ
            answer += cur-job[0]
        } else {
        // ํ์ ๋์คํฌ๊ฐ ์๋ค๋ฉด ํ ๋์คํฌ์ ์์์๊ฐ์ด ํ์ฌ ์๊ฐ
            cur = jobs[i][0]
        }
    }
    return answer/len >> 0
}