
ํด๋น ํ์ด๋ ํ๋ก๊ทธ๋๋จธ์ค Jang Sungil๋์ ํ์ด๋ฒ์ ํด์ํ์ฌ ์ ์๋์์์ ๋ฐํ๋๋ค.

๐งก๋ฌธ์ ์ค๋ช
๋น์ ์ ์ผ๋ ฌ๋ก ๋์ด๋ n๊ฐ์ ์ง์ ํ๋ฐฐ๋ฅผ ๋ฐฐ๋ฌํ๋ ค ํฉ๋๋ค. ๋ฐฐ๋ฌํ  ๋ฌผ๊ฑด์ ๋ชจ๋ ํฌ๊ธฐ๊ฐ ๊ฐ์ ์ฌํ์ฉ ํ๋ฐฐ ์์์ ๋ด์ ๋ฐฐ๋ฌํ๋ฉฐ, ๋ฐฐ๋ฌ์ ๋ค๋๋ฉด์ ๋น ์ฌํ์ฉ ํ๋ฐฐ ์์๋ค์ ์๊ฑฐํ๋ ค ํฉ๋๋ค.
๋ฐฐ๋ฌํ  ํ๋ฐฐ๋ค์ ๋ชจ๋ ์ฌํ์ฉ ํ๋ฐฐ ์์์ ๋ด๊ฒจ์ ๋ฌผ๋ฅ์ฐฝ๊ณ ์ ๋ณด๊ด๋์ด ์๊ณ , i๋ฒ์งธ ์ง์ ๋ฌผ๋ฅ์ฐฝ๊ณ ์์ ๊ฑฐ๋ฆฌ i๋งํผ ๋จ์ด์ ธ ์์ต๋๋ค. ๋ํ i๋ฒ์งธ ์ง์ j๋ฒ์งธ ์ง๊ณผ ๊ฑฐ๋ฆฌ j - i๋งํผ ๋จ์ด์ ธ ์์ต๋๋ค. (1 โค i โค j โค n)
ํธ๋ญ์๋ ์ฌํ์ฉ ํ๋ฐฐ ์์๋ฅผ ์ต๋ cap๊ฐ ์ค์ ์ ์์ต๋๋ค. ํธ๋ญ์ ๋ฐฐ๋ฌํ  ์ฌํ์ฉ ํ๋ฐฐ ์์๋ค์ ์ค์ด ๋ฌผ๋ฅ์ฐฝ๊ณ ์์ ์ถ๋ฐํด ๊ฐ ์ง์ ๋ฐฐ๋ฌํ๋ฉด์, ๋น ์ฌํ์ฉ ํ๋ฐฐ ์์๋ค์ ์๊ฑฐํด ๋ฌผ๋ฅ์ฐฝ๊ณ ์ ๋ด๋ฆฝ๋๋ค. ๊ฐ ์ง๋ง๋ค ๋ฐฐ๋ฌํ  ์ฌํ์ฉ ํ๋ฐฐ ์์์ ๊ฐ์์ ์๊ฑฐํ  ๋น ์ฌํ์ฉ ํ๋ฐฐ ์์์ ๊ฐ์๋ฅผ ์๊ณ  ์์ ๋, ํธ๋ญ ํ๋๋ก ๋ชจ๋  ๋ฐฐ๋ฌ๊ณผ ์๊ฑฐ๋ฅผ ๋ง์น๊ณ  ๋ฌผ๋ฅ์ฐฝ๊ณ ๊น์ง ๋์์ฌ ์ ์๋ ์ต์ ์ด๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ค ํฉ๋๋ค. ๊ฐ ์ง์ ๋ฐฐ๋ฌ ๋ฐ ์๊ฑฐํ  ๋, ์ํ๋ ๊ฐ์๋งํผ ํ๋ฐฐ๋ฅผ ๋ฐฐ๋ฌ ๋ฐ ์๊ฑฐํ  ์ ์์ต๋๋ค.
๋ค์์ cap=4 ์ผ ๋, ์ต์ ๊ฑฐ๋ฆฌ๋ก ์ด๋ํ๋ฉด์ 5๊ฐ์ ์ง์ ๋ฐฐ๋ฌ ๋ฐ ์๊ฑฐํ๋ ๊ณผ์ ์ ๋ํ๋ธ ์์์
๋๋ค.
๋ฐฐ๋ฌ ๋ฐ ์๊ฑฐํ ์ฌํ์ฉ ํ๋ฐฐ ์์ ๊ฐ์
| ใ | ์ง #1 | ์ง #2 | ์ง #3 | ์ง #4 | ์ง #5 | 
|---|---|---|---|---|---|
| ๋ฐฐ๋ฌ | 1๊ฐ | 0๊ฐ | 3๊ฐ | 1๊ฐ | 2๊ฐ | 
| ์๊ฑฐ | 0๊ฐ | 3๊ฐ | 0๊ฐ | 4๊ฐ | 0๊ฐ | 
๋ฐฐ๋ฌ ๋ฐ ์๊ฑฐ ๊ณผ์ 
| ใ | ์ง #1 | ์ง #2 | ์ง #3 | ์ง #4 | ์ง #5 | ์ค๋ช | 
|---|---|---|---|---|---|---|
| ๋จ์ ๋ฐฐ๋ฌ/์๊ฑฐ | 1/0 | 0/3 | 3/0 | 1/4 | 2/0 | ๋ฌผ๋ฅ์ฐฝ๊ณ ์์ ํ๋ฐฐ 3๊ฐ๋ฅผ ํธ๋ญ์ ์ค์ด ์ถ๋ฐํฉ๋๋ค. | 
| ๋จ์ ๋ฐฐ๋ฌ/์๊ฑฐ | 1/0 | 0/3 | 3/0 | 0/4 | 0/0 | ๋ฌผ๋ฅ์ฐฝ๊ณ ์์ 5๋ฒ์งธ ์ง๊น์ง ์ด๋ํ๋ฉด์(๊ฑฐ๋ฆฌ 5) 4๋ฒ์งธ ์ง์ ํ๋ฐฐ 1๊ฐ๋ฅผ ๋ฐฐ๋ฌํ๊ณ , 5๋ฒ์งธ ์ง์ ํ๋ฐฐ 2๊ฐ๋ฅผ ๋ฐฐ๋ฌํฉ๋๋ค. | 
| ๋จ์ ๋ฐฐ๋ฌ/์๊ฑฐ | 1/0 | 0/3 | 3/0 | 0/0 | 0/0 | 5๋ฒ์งธ ์ง์์ ๋ฌผ๋ฅ์ฐฝ๊ณ ๊น์ง ์ด๋ํ๋ฉด์(๊ฑฐ๋ฆฌ 5) 4๋ฒ์งธ ์ง์์ ๋น ํ๋ฐฐ ์์ 4๊ฐ๋ฅผ ์๊ฑฐํ ํ, ์๊ฑฐํ ๋น ํ๋ฐฐ ์์๋ฅผ ๋ฌผ๋ฅ์ฐฝ๊ณ ์ ๋ด๋ฆฌ๊ณ ํ๋ฐฐ 4๊ฐ๋ฅผ ํธ๋ญ์ ์ฃ์ต๋๋ค. | 
| ๋จ์ ๋ฐฐ๋ฌ/์๊ฑฐ | 0/0 | 0/3 | 0/0 | 0/0 | 0/0 | ๋ฌผ๋ฅ์ฐฝ๊ณ ์์ 3๋ฒ์งธ ์ง๊น์ง ์ด๋ํ๋ฉด์(๊ฑฐ๋ฆฌ 3) 1๋ฒ์งธ ์ง์ ํ๋ฐฐ 1๊ฐ๋ฅผ ๋ฐฐ๋ฌํ๊ณ , 3๋ฒ์งธ ์ง์ ํ๋ฐฐ 3๊ฐ๋ฅผ ๋ฐฐ๋ฌํฉ๋๋ค. | 
| ๋จ์ ๋ฐฐ๋ฌ/์๊ฑฐ | 0/0 | 0/0 | 0/0 | 0/0 | 0/0 | 3๋ฒ์งธ ์ง์์ ๋ฌผ๋ฅ์ฐฝ๊ณ ๊น์ง ์ด๋ํ๋ฉด์(๊ฑฐ๋ฆฌ 3) 2๋ฒ์งธ ์ง์์ ๋น ํ๋ฐฐ ์์ 3๊ฐ๋ฅผ ์๊ฑฐํ ํ, ์๊ฑฐํ ๋น ํ๋ฐฐ ์์๋ฅผ ๋ฌผ๋ฅ์ฐฝ๊ณ ์ ๋ด๋ฆฝ๋๋ค. | 
16(=5+5+3+3)์ ๊ฑฐ๋ฆฌ๋ฅผ ์ด๋ํ๋ฉด์ ๋ชจ๋ ๋ฐฐ๋ฌ ๋ฐ ์๊ฑฐ๋ฅผ ๋ง์ณค์ต๋๋ค. ๊ฐ์ ๊ฑฐ๋ฆฌ๋ก ๋ชจ๋ ๋ฐฐ๋ฌ ๋ฐ ์๊ฑฐ๋ฅผ ๋ง์น๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์์ง๋ง, ์ด๋ณด๋ค ์งง์ ๊ฑฐ๋ฆฌ๋ก ๋ชจ๋ ๋ฐฐ๋ฌ ๋ฐ ์๊ฑฐ๋ฅผ ๋ง์น๋ ๋ฐฉ๋ฒ์ ์์ต๋๋ค.
ํธ๋ญ์ ์ค์ ์ ์๋ ์ฌํ์ฉ ํ๋ฐฐ ์์์ ์ต๋ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ์ ์ cap, ๋ฐฐ๋ฌํ  ์ง์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ์ ์ n, ๊ฐ ์ง์ ๋ฐฐ๋ฌํ  ์ฌํ์ฉ ํ๋ฐฐ ์์์ ๊ฐ์๋ฅผ ๋ด์ 1์ฐจ์ ์ ์ ๋ฐฐ์ด deliveries์ ๊ฐ ์ง์์ ์๊ฑฐํ  ๋น ์ฌํ์ฉ ํ๋ฐฐ ์์์ ๊ฐ์๋ฅผ ๋ด์ 1์ฐจ์ ์ ์ ๋ฐฐ์ด pickups๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง๋๋ค. ์ด๋, ํธ๋ญ ํ๋๋ก ๋ชจ๋  ๋ฐฐ๋ฌ๊ณผ ์๊ฑฐ๋ฅผ ๋ง์น๊ณ  ๋ฌผ๋ฅ์ฐฝ๊ณ ๊น์ง ๋์์ฌ ์ ์๋ ์ต์ ์ด๋ ๊ฑฐ๋ฆฌ๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด ์ฃผ์ธ์.
๐์ ํ์ฌํญ
cap โค 50n โค 100,000deliveries์ ๊ธธ์ด = pickups์ ๊ธธ์ด = ndeliveries[i]๋ i+1๋ฒ์งธ ์ง์ ๋ฐฐ๋ฌํ  ์ฌํ์ฉ ํ๋ฐฐ ์์์ ๊ฐ์๋ฅผ ๋ํ๋
๋๋ค.pickups[i]๋ i+1๋ฒ์งธ ์ง์์ ์๊ฑฐํ  ๋น ์ฌํ์ฉ ํ๋ฐฐ ์์์ ๊ฐ์๋ฅผ ๋ํ๋
๋๋ค.deliveries์ ์์ โค 50pickups์ ์์ โค 50๐์ ์ถ๋ ฅ ์
| cap | n | deliveries | pickups | result | 
|---|---|---|---|---|
| 4 | 5 | [1, 0, 3, 1, 2] | [0, 3, 0, 4, 0] | 16 | 
| 2 | 7 | [1, 0, 2, 0, 1, 0, 2] | [0, 2, 0, 1, 0, 2, 0] | 30 | 
๐์ ์ถ๋ ฅ ์ ์ค๋ช
์ ์ถ๋ ฅ ์ #1
์ ์ถ๋ ฅ ์ #2
๋ฐฐ๋ฌ ๋ฐ ์๊ฑฐํ ์ฌํ์ฉ ํ๋ฐฐ ์์ ๊ฐ์
| ใ | ์ง #1 | ์ง #2 | ์ง #3 | ์ง #4 | ์ง #5 | ์ง #6 | ์ง #7 | 
|---|---|---|---|---|---|---|---|
| ๋ฐฐ๋ฌ | 1๊ฐ | 0๊ฐ | 2๊ฐ | 0๊ฐ | 1๊ฐ | 0๊ฐ | 2๊ฐ | 
| ์๊ฑฐ | 0๊ฐ | 2๊ฐ | 0๊ฐ | 1๊ฐ | 0๊ฐ | 2๊ฐ | 0๊ฐ | 
๋ฐฐ๋ฌ ๋ฐ ์๊ฑฐ ๊ณผ์ 
| ใ | ์ง #1 | ์ง #2 | ์ง #3 | ์ง #4 | ์ง #5 | ์ง #6 | ์ง #7 | ์ค๋ช | 
|---|---|---|---|---|---|---|---|---|
| ๋จ์ ๋ฐฐ๋ฌ/์๊ฑฐ | 1/0 | 0/2 | 2/0 | 0/1 | 1/0 | 0/2 | 2/0 | ๋ฌผ๋ฅ์ฐฝ๊ณ ์์ ํ๋ฐฐ 2๊ฐ๋ฅผ ํธ๋ญ์ ์ค์ด ์ถ๋ฐํฉ๋๋ค. | 
| ๋จ์ ๋ฐฐ๋ฌ/์๊ฑฐ | 1/0 | 0/2 | 2/0 | 0/1 | 1/0 | 0/2 | 0/0 | ๋ฌผ๋ฅ์ฐฝ๊ณ ์์ 7๋ฒ์งธ ์ง๊น์ง ์ด๋ํ๋ฉด์(๊ฑฐ๋ฆฌ 7) 7๋ฒ์งธ ์ง์ ํ๋ฐฐ 2๊ฐ๋ฅผ ๋ฐฐ๋ฌํฉ๋๋ค. | 
| ๋จ์ ๋ฐฐ๋ฌ/์๊ฑฐ | 1/0 | 0/2 | 2/0 | 0/1 | 1/0 | 0/0 | 0/0 | 7๋ฒ์งธ ์ง์์ ๋ฌผ๋ฅ์ฐฝ๊ณ ๊น์ง ์ด๋ํ๋ฉด์(๊ฑฐ๋ฆฌ 7) 6๋ฒ์งธ ์ง์์ ๋น ํ๋ฐฐ ์์ 2๊ฐ๋ฅผ ์๊ฑฐํ ํ, ์๊ฑฐํ ๋น ํ๋ฐฐ ์์๋ฅผ ๋ฌผ๋ฅ์ฐฝ๊ณ ์ ๋ด๋ฆฌ๊ณ ํ๋ฐฐ 2๊ฐ๋ฅผ ํธ๋ญ์ ์ฃ์ต๋๋ค. | 
| ๋จ์ ๋ฐฐ๋ฌ/์๊ฑฐ | 1/0 | 0/2 | 1/0 | 0/1 | 0/0 | 0/0 | 0/0 | ๋ฌผ๋ฅ์ฐฝ๊ณ ์์ 5๋ฒ์งธ ์ง๊น์ง ์ด๋ํ๋ฉด์(๊ฑฐ๋ฆฌ 5) 3๋ฒ์งธ ์ง์ ํ๋ฐฐ 1๊ฐ๋ฅผ ๋ฐฐ๋ฌํ๊ณ , 5๋ฒ์งธ ์ง์ ํ๋ฐฐ 1๊ฐ๋ฅผ ๋ฐฐ๋ฌํฉ๋๋ค. | 
| ๋จ์ ๋ฐฐ๋ฌ/์๊ฑฐ | 1/0 | 0/1 | 1/0 | 0/0 | 0/0 | 0/0 | 0/0 | 5๋ฒ์งธ ์ง์์ ๋ฌผ๋ฅ์ฐฝ๊ณ ๊น์ง ์ด๋ํ๋ฉด์(๊ฑฐ๋ฆฌ 5) 4๋ฒ์งธ ์ง์์ ๋น ํ๋ฐฐ ์์ 1๊ฐ๋ฅผ ์๊ฑฐํ๊ณ 2๋ฒ์งธ ์ง์์ ๋น ํ๋ฐฐ ์์ 1๊ฐ๋ฅผ ์๊ฑฐํ ํ, ์๊ฑฐํ ๋น ํ๋ฐฐ ์์๋ฅผ ๋ฌผ๋ฅ์ฐฝ๊ณ ์ ๋ด๋ฆฌ๊ณ ํ๋ฐฐ 2๊ฐ๋ฅผ ํธ๋ญ์ ์ฃ์ต๋๋ค. | 
| ๋จ์ ๋ฐฐ๋ฌ/์๊ฑฐ | 0/0 | 0/1 | 0/0 | 0/0 | 0/0 | 0/0 | 0/0 | ๋ฌผ๋ฅ์ฐฝ๊ณ ์์ 3๋ฒ์งธ ์ง๊น์ง ์ด๋ํ๋ฉด์(๊ฑฐ๋ฆฌ 3) 1๋ฒ์งธ ์ง์ ํ๋ฐฐ 1๊ฐ๋ฅผ ๋ฐฐ๋ฌํ๊ณ , 3๋ฒ์งธ ์ง์ ํ๋ฐฐ 1๊ฐ๋ฅผ ๋ฐฐ๋ฌํฉ๋๋ค. | 
| ๋จ์ ๋ฐฐ๋ฌ/์๊ฑฐ | 0/0 | 0/0 | 0/0 | 0/0 | 0/0 | 0/0 | 0/0 | 3๋ฒ์งธ ์ง์์ ๋ฌผ๋ฅ์ฐฝ๊ณ ๊น์ง ์ด๋ํ๋ฉด์(๊ฑฐ๋ฆฌ 3) 2๋ฒ์งธ ์ง์์ ๋น ํ๋ฐฐ ์์ 1๊ฐ๋ฅผ ์๊ฑฐํ ํ, ์๊ฑฐํ ๋น ํ๋ฐฐ ์์๋ฅผ ๋ฌผ๋ฅ์ฐฝ๊ณ ์ ๋ด๋ฆฝ๋๋ค. | 
30(=7+7+5+5+3+3)์ ๊ฑฐ๋ฆฌ๋ฅผ ์ด๋ํ๋ฉด์ ๋ชจ๋  ๋ฐฐ๋ฌ ๋ฐ ์๊ฑฐ๋ฅผ ๋ง์ณค์ต๋๋ค. ๊ฐ์ ๊ฑฐ๋ฆฌ๋ก ๋ชจ๋  ๋ฐฐ๋ฌ ๋ฐ ์๊ฑฐ๋ฅผ ๋ง์น๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์์ง๋ง, ์ด๋ณด๋ค ์งง์ ๊ฑฐ๋ฆฌ๋ก ๋ชจ๋  ๋ฐฐ๋ฌ ๋ฐ ์๊ฑฐ๋ฅผ ๋ง์น๋ ๋ฐฉ๋ฒ์ ์์ต๋๋ค.
๋ฐ๋ผ์, 30์ return ํ๋ฉด ๋ฉ๋๋ค.
๐๋์ ํ์ด
function solution(cap, n, deliveries, pickups) {
    // ๋ต์ ๋ณ์
    let result = 0
    // ๋ฐฐ๋ฌ ๊ฑฐ๋ฆฌ, ํ์ ๊ฑฐ๋ฆฌ ์นด์ดํธ ๋ณ์
    const eachDist = [0, 0]
    // ๋ฐฐ๋ฌ ์ธ๋ฑ์ค, ํ์ ์ธ๋ฑ์ค
    // ํญ์ ๊ฐ์ฅ ๋งจ ๋ค์์ ์ถ๋ฐํจ (n-1)
    let dIdx = n-1
    let pIdx = n-1
    // ๋ฐฐ๋ฌ, ํ์๊ฐ ์ข
๋ฃ๋ ์ธ๋ฑ์ค ๋ฐฐ์ด
    const de_end = []
    const pick_end = []
    // ๋ฐฐ๋ฌํ  ๊ณณ์ด ๋จ์์๋ ๋์ ๋ฐ๋ณต
    while(dIdx > -1) {
        // ํ์ฌ ๋ฐฐ๋ฌํด์ผํ๋ ๋ฌผํ์ ์ฃ๋๋ค. (๋ฌผํ์ ์ - ์ต๋ ์ ์ฌ ์) // 0๋ณด๋ค ์ ๋ค๋ฉด ์ ์ฌ ๊ฐ๋ฅ, 0 ์ด๋ผ๋ฉด ์ฆ์ ๊ทํ, 0๋ณด๋ค ๋ง๋ค๋ฉด ์ผ๋ถ๋ง ๋ฐฐ๋ฌ
        let diff = eachDist[0] + deliveries[dIdx] - cap
        // ๋ชจ๋  ๋ฌผํ์ ์ ์ฌํ ๊ฒฝ์ฐ
        if(eachDist[0] === 0 && deliveries[dIdx] > 0) {
            de_end.push(dIdx)
        }
        // ์ด๋ฒ ๋ฌผํ์ ๋ชจ๋ ์ ์ฌํ  ์ ์๋ ์ฌ์ ๊ณต๊ฐ์ด ์๋ค๋ฉด
        if(diff <= 0) {
            eachDist[0] += deliveries[dIdx]
            deliveries[dIdx] = 0
        // ์ ์ฌ ๊ฐ๋ฅํ ์๋ณด๋ค ๋ง์ ๋ฌผํ์ด ์๋ค๋ฉด
        } else if(diff > 0) {
            deliveries[dIdx] -= cap - eachDist[0]
            eachDist[0] = 0
            continue
        }
        dIdx--
    }
    // ํ์ํ  ๊ณณ์ด ๋จ์์๋ ๋์ ๋ฐ๋ณต    
    while(pIdx > -1) {
        let diff = eachDist[1] + pickups[pIdx] - cap
        if(eachDist[1] === 0 && pickups[pIdx] > 0) {
            pick_end.push(pIdx)   
        }
        if(diff <= 0) {
            eachDist[1] += pickups[pIdx]
            pickups[pIdx] = 0   
        }
        else if(diff > 0) {
            pickups[pIdx] -= cap - eachDist[1]
            eachDist[1] = 0
            continue
        }
        pIdx -= 1
    }
    // ๋ฐฐ๋ฌ ํน์ ํ์๊ฐ ๊ฐ๋ฅํ๋ค๋ฉด
    if(de_end.length > 0 && pick_end.length > 0) {
        // ๋ฐฐ๋ฌ ์์ ํ์ ์ ์ค ์ต์๊ฐ์ ์
๋ ฅ
        let min_len = de_end.length >= pick_end.length ? pick_end.length : de_end.length
        // ์ต์ ๊ฐ ๋งํผ ๋ฐ๋ณต
        // ์๋ณต๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํด์ผํ๋ฏ๋ก 2 * (n+1)
        for(let i = 0 ; i < min_len ; i ++) {
            const d_last = de_end.shift()
            const p_last = pick_end.shift()
            result += 2 * (p_last > d_last ? p_last + 1 : d_last + 1)
        }
        while(de_end.length > 0) {
            result += 2 * (de_end.shift() + 1)
        }
        while(pick_end.length > 0) {
            result += 2 * (pick_end.shift() + 1)
        }
    }
//
    return result
}