[ํ๋ก๊ทธ๋๋จธ์ค Lv.3] ์ ๊ตญ์ฌ์ฌ
https://programmers.co.kr/learn/courses/30/lessons/43238?language=javascript
const binarySearch = (times, n) => {
let left = 0;
let right = n * times[times.length - 1];
let middle, people;
while(left <= right) {
middle = Math.floor((left + right) / 2);
people = times.reduce((prev, cur) => prev + Math.floor(middle/cur), 0);
if(people >= n) {
right = middle - 1;
} else {
left = middle + 1;
}
}
return left;
}
function solution(n, times) {
times = times.sort((a,b) => a-b);
return binarySearch(times,n);
}
์ด๋ถํ์ ๋ฌธ์ ์ด๋ค.
์ ๋ ฅ์ ์๋ก๋ค๋ฉด ์ต์์๊ฐ์ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ฏ๋ก ์ต์๊ฐ(left)๋ 1๋ก ๋๊ณ , ์ต๋๊ฐ์ ์ ๋ ฌ๋ times๋ฐฐ์ด์ ๋ง์ง๋ง ๊ฐ์ ์ธ์์๋ฅผ ๊ณฑํ ๊ฐ์ ๋ฃ์ด์ฃผ์. right = 10 * 6 = 60
๊ทธ ํ while๋ฌธ์ ๋๋ฉฐ ์ด๋ถ ํ์์ ํ๋ฉด๋๋ค.
n = 6, times = [7, 10]
์ฒซ ๋ฒ์งธ ๋ฐ๋ณต
middle๊ฐ => Math.floor((0+60)/2) => 30
people๊ฐ => Math.floor(30/7) + Math.floor(30/10) => 7
7์ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง n๊ฐ๋ณด๋ค ํฌ๋ฏ๋ก right๊ฐ์ middle - 1 ๊ฐ์ผ๋ก ์ง์ ํด์ค๋ค.
๋ ๋ฒ์งธ ๋ฐ๋ณต
middle๊ฐ => Math.floor((0+29)/2) => 14
people๊ฐ => Math.floor(14/7) + Math.floor(14/10) => 3
3์ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง n๊ฐ๋ณด๋ค ํ์ ํ ์์ผ๋ฏ๋ก left๊ฐ์ middle + 1๋ก ๋ฐ๊ฟ์ค๋ค.
์ธ ๋ฒ์งธ ๋ฐ๋ณต
middle๊ฐ => Math.floor((15+29)/2) => 22
people๊ฐ => Math.floor(22/7) + Math.floor(22/10) => 5
3์ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง n๊ฐ๋ณด๋ค ํ์ ํ ์์ผ๋ฏ๋ก left๊ฐ์ middle + 1๋ก ๋ฐ๊ฟ์ค๋ค.
.
.
.
์ ๋ต์ด ๊ตฌํด์ง ๋๊น์ง ๋ฐ๋ณตํ๋ฉด left๊ฐ์ด right๊ฐ๊ณผ ๊ฐ์์ง๊ฑฐ๋ ๋์ ๋ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฐ(์ต์์๊ฐ)์ ๊ตฌํ ์ ์๋ค.
์ ๋ต์ด 30์ด์ด๋ ๋์ง๋ง left >= right๊น์ง ๋ฐ๋ณตํ๋ฏ๋ก ์ต์์๊ฐ์ ๊ตฌํ ์ ์์