๐ 11 - ๋ฎค์ง ๋น๋์ค(๊ฒฐ์ ์๊ณ ๋ฆฌ์ฆ)
DVD์๋ ์ด N๊ฐ์ ๊ณก์ด ๋ค์ด๊ฐ๋๋ฐ, DVD์ ๋ นํํ ๋์๋ ๋ผ์ด๋ธ์์์ ์์๊ฐ ๊ทธ๋๋ก ์ ์ง๋์ด์ผ ํ๋ค. ์ฆ 1๋ฒ ๋ ธ๋์ 5๋ฒ ๋ ธ๋๋ฅผ ๊ฐ์ DVD์ ๋ นํํ๊ธฐ ์ํด์๋ 1๋ฒ๊ณผ 5๋ฒ ์ฌ์ด์ ๋ชจ๋ ๋ ธ๋๋ ๊ฐ์ DVD์ ๋ นํํด์ผ ํ๋ค. ๋ํ, ํ ๋ ธ๋๋ฅผ ์ชผ๊ฐ์ ๋ ๊ฐ์ DVD์ ๋ นํํ๋ฉด ์๋๋ค. M๊ฐ์ DVD์ ๋ชจ๋ ๋์์์ ๋ นํํ๊ธฐ๋ก ํ๋ค. ์ด ๋ DVD์ ํฌ๊ธฐ๋ฅผ ์ต์๋ก ํ๋ ค๊ณ ํ๋ค. ๊ทธ๋ฆฌ๊ณ M๊ฐ์ DVD๋ ๋ชจ๋ ๊ฐ์ ํฌ๊ธฐ์ฌ์ผ ์ ์กฐ์๊ฐ๊ฐ ์ ๊ฒ ๋ค๊ธฐ ๋๋ฌธ์ ๊ผญ ๊ฐ์ ํฌ๊ธฐ๋ก ํด์ผ ํ๋ค.
์ ๋ฌธ์ ๋ฅผ ์ ๋ฆฌํด๋ณด๋ฉด M๊ฐ์ ๊ฐ์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ DVD์ ์์ ์ ๋ด์์ผ ํ๋๋ฐ, ๊ทธ ํฌ๊ธฐ๊ฐ ๊ฐ์ฅ ์ต์๊ฐ ๋๋ ๊ฐ์ ์ฐพ๋ ๋ฌธ์ ์ด๋ค. ํน์ ํ ์ํฉ์์ ์ต์ ์ ๊ฐ์ ๊ตฌํด์ผ ํ๋ฏ๋ก ์ด๋ถ ํ์์ ์ด์ฉํ ํ๋ผ๋ฉํธ๋ฆญ ์์น ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
ํ๋ผ๋ฉํธ๋ฆญ ์์น ์๊ณ ๋ฆฌ์ฆ์ด๋โ ์ด๋ถ ํ์๊ณผ ๋ค๋ฅด๊ฒ ์ฃผ์ด์ง ์ผ๋ จ์ ๊ฐ๋ค์ด ์๋๋ผ ์ฃผ์ด์ง ๋ฒ์ ๋ด์์ ์ํ๋ ๊ฐ ๋๋ ์ํ๋ ์กฐ๊ฑด์ ๊ฐ์ฅ ์ผ์นํ๋ ๊ฐ์ ์ฐพ์๋ด๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
ํ๋ผ๋ฉํธ๋ฆญ ์์น ์๊ณ ๋ฆฌ์ฆ์ ์ฃผ์ ํน์ง์ ๋ฒ์ ๋ด์์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฐ์ด ์๋๋ผ๋ ๊ฑฐ๊ธฐ์ ๋๋๋ ๊ฒ์ด ์๋๋ผ ๊ทธ๊ฒ๋ณด๋ค ๋ ์ข์ ์ต์ ์ ๋ต์ด ์๋์ง ํ์ํ๋ค๋ ๊ฒ์ด๋ค.
๐ ํ์ด ๋ฐฉ๋ฒ
์ต์ ์ ๋ต์ ์ฐพ๋ ๋ฌธ์ ์ด๋ฏ๋ก while ๋ฌธ์ lt๊ฐ rt๋ฅผ ์ด๊ณผํ๊ธฐ ์ ๊น์ง ํ์์ ๊ณ์ ํด์ผํ๋ค.
- lt๋ DVD๊ฐ ๊ฐ์ง ์ ์๋ ์ต์ ํฌ๊ธฐ์ด๋ค. ํ ๋ ธ๋๋ฅผ ๋ ๊ฐ๋ก ์ชผ๊ฐค ์ ์๊ธฐ ๋๋ฌธ์ ์ฃผ์ด์ง ์์ ๋ค ์ค ์ ์ผ ๊ธด ์์ ์ด DVD๊ฐ ๊ฐ์ง ์ ์๋ ์ต์ ํฌ๊ธฐ๊ฐ ๋๋ค.
- rt๋ DVD๊ฐ ๊ฐ์ง ์ ์๋ ์ต๋ ํฌ๊ธฐ์ด๋ค. songs ๋ฐฐ์ด์ ๊ฐ๋ค์ ๋ชจ๋ ๋ํ ๊ฐ์ ์ ์ฅํ๋๋ฐ, ๋ถ๋ฅธ ๊ณก์ ๊ธธ์ด๊ฐ 10,000๋ถ์ ๋์ง ์์ผ๋ฏ๋ก 10,000์ผ๋ก ์ ์ฅํด๋ ๋๋ค. ์ต๋ ํฌ๊ธฐ๋ ๋ถ์ ํํด๋ ์๊ด์๋ค. ์ด๋ถ ํ์์ ์ด์ฉํ๋ฉด ํ๋ฒ ๋น๊ตํ ๋๋ง๋ค ์ ๋ฐ์ฉ ํ์์์ ์ ์ธ๋๊ธฐ ๋๋ฌธ์ ๊ธ๋ฐฉ ์ต์ ์ ๊ฐ์ ์ฐพ์ ์ ์๋ค.
- count() ํจ์๋ DVD์ ํฌ๊ธฐ๋ฅผ ์ธ์๋ก ๋ฐ์ ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ด๋๋ฐ ๋ช ๊ฐ์ DVD๊ฐ ํ์ํ์ง๋ฅผ ๋ฆฌํดํด์ค๋ค.
- ํ์ํ DVD์ ๊ฐ์๊ฐ ์ฃผ์ด์ง m๊ฐ ์ดํ์ด๋ฉด mid(DVD์ ํฌ๊ธฐ)๊ฐ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฐ์ด๋ฏ๋ก answer์ mid๋ฅผ ์ ์ฅํ๋ค. ๋ํ, DVD์ ์ต์ ํฌ๊ธฐ๋ฅผ ๊ตฌํ๊ณ ์๊ธฐ ๋๋ฌธ์ mid ์ด์์ ๊ฐ๋ค์ ํ์์์ ์ ์ธ๋๋ค. rt = mid - 1
- ํ์ํ DVD์ ๊ฐ์๊ฐ m๊ฐ๋ฅผ ์ด๊ณผํ๋ฉด mid ์ดํ์ ํฌ๊ธฐ๋ ์กฐ๊ฑด์ ๋ง์กฑํ ์ ์์ผ๋ฏ๋ก mid ์ดํ์ ๊ฐ๋ค์ ํ์์์ ์ ์ธ๋๋ค. lt = mid + 1
๐ ํ์ด
function count(songs, capacity) {
let dvdCnt = 1;
let sum = 0;
for (let x of songs) {
if (sum + x <= capacity) {
sum += x;
} else {
dvdCnt++;
sum = x;
}
}
return dvdCnt;
}
function solution(m, songs) {
let answer;
let lt = Math.max(...songs);
let rt = songs.reduce((sum, song) => (sum += song));
while (lt <= rt) {
let mid = Math.floor((lt + rt) / 2);
if (count(songs, mid) <= m) {
answer = mid;
rt = mid - 1;
} else {
lt = mid + 1;
}
}
return answer;
}
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
console.log(solution(3, arr));
๐ ์ฐธ๊ณ ํ ์ฌ์ดํธ
'Algorithm > ์ธํ๋ฐ(inflearn)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JavaScript/section 8] 01 - ์ฌ๊ทํจ์ (0) | 2022.10.14 |
---|---|
[JavaScript/section 7] 12 - ๋ง๊ตฌ๊ฐ ์ ํ๊ธฐ (0) | 2022.10.12 |
[JavaScript/section 7] 10 - ์ด๋ถ ๊ฒ์ (2) | 2022.10.09 |
[JavaScript/section 7] 09 - ๊ฒฐํผ์ (2) | 2022.10.08 |
[JavaScript/section 7] 08 - ํ์์ค ๋ฐฐ์ (0) | 2022.10.07 |