[JavaScript] ํ๋ก๊ทธ๋๋จธ์ค - ๋ฌด์ง์ ๋จน๋ฐฉ ๋ผ์ด๋ธ
[๋ฌธ์ ]
https://school.programmers.co.kr/learn/courses/30/lessons/42891
[ํ์ด]
๋ฌธ์ ์ ํต์ฌ์ ์ด๋ถํ์์ ํตํด ํ์ ํ์ด ๋ช๋ฒ์งธ ๋์์ ๋ k+1์ด๊ฐ ๋๋์ง ์ฐพ์์ผ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด ํ์ ํ์ด [3, 1, 2]์ด๊ณ k๊ฐ 5๋ผ๋ฉด k+1์ธ 6์ด์ ์ด๋ค ๊ทธ๋ฆ์ ๋จน๋์ง ์ฐพ์์ผ ํฉ๋๋ค.
- 1ํ์ : [2, 0, 1] -> 3์ด ์ง๋จ
- 2ํ์ : [1, 0, 0] -> 5์ด ์ง๋จ
- 3ํ์ : [0, 0, 0] -> 6์ด ์ง๋จ
๋ฐ๋ผ์ 3ํ์ ์ 6์ด๊ฐ ํฌํจ๋์ด ์์ผ๋ฏ๋ก 3ํ์ ์ ๊ฒ์ํ์ฌ 1๋ฒ ๊ทธ๋ฆ์ ๋จน๋๊ฒ์ ๊ตฌํ ์ ์์ต๋๋ค.
์ด๋ถํ์์ ์ฌ์ฉํ์ฌ k+1์ด ํฌํจ๋ ํ์ ์ ์ฐพ๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด๊ธฐ ์ธํ
- ์ต์ ํ์ ์ left = 1;
- ์ต๋ ํ์ ์ right = 6; (๋ชจ๋ ๊ทธ๋ฆ์ ์ดํฉ = 3 + 1 + 2)
์ด๋ถํ์ ๊ณผ์
- mid = (left + right)/2 = 3 => 3ํ์ ์์ ์๊ฐ์ 6์ด๋ฏ๋ก right = 2 ๋ก ๊ฐฑ์
- mid = 1 ์ด๋ฏ๋ก 1ํ์ ์์ ์๊ฐ์ 3์ด๋ฏ๋ก left = 2๋ก ๊ฐฑ์
- mid = 2 ์ด๋ฏ๋ก 2ํ์ ์์์๊ฐ์ 5์ด๋ฏ๋ก left = 3์ผ๋ก ๊ฐฑ์
- ์ด๋ถํ์์ด ์ข ๋ฃ๋๊ณ left = 3์ด๋ฏ๋ก 3ํ์ ์ ์ฐ๋ฆฌ๊ฐ ์ฐพ๋ k+1์ด ํฌํจ
๋ฐ๋ผ์ left - 1 (2) ํ์ ์ด ๋๋ํ ์๊ฐ์ 5์ด์ด๊ณ , 2ํ์ ์ด ๋๋ํ ํ์ ํ์ ์์ ์ํ food๋ฐฐ์ด์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
[ [ 3, 1 ] ]
๋ฐ๋ผ์ 6์ด์ผ๋๋ 1๋ฒ ํ์ ํ์ ๋จน๊ฒ๋ฉ๋๋ค.
[์ฝ๋]
function solution(food_times, k) {
var answer = -1;
let sum = food_times.reduce((acc, cur) => acc + cur);
if(sum < k) {
return answer;
}
// ์ต์ rotate 1, ์ต๋ rotate 6
let left = 1;
let right = sum;
while(left <= right) {
let mid = Math.floor((left + right)/2);
let time = 0;
food_times.forEach((i) => {
if(i <= mid) {
time += i;
} else {
time += mid;
}
});
if(time < k+1) {
left = mid + 1;
} else {
right = mid - 1;
}
}
let time = 0;
left--;
food_times.forEach((i) => {
if(i <= left) {
time += i;
} else {
time += left;
}
});
let foods = food_times.map((i, idx) => [i, idx+1]).filter((i) => i[0] > left);
for(let i=0;i<foods.length;i++) {
time++;
if(time === k+1) {
answer = foods[i][1];
break;
}
}
return answer;
}