๐ฉ๐ปโ๐ป๋ฌธ์ ๋งํฌ
[์ธํ๋ฐ ์น์
7] ๋ง๊ตฌ๊ฐ ์ ํ๊ธฐ (Javascript)
์ ๋ฃ ๊ฐ์์ธ ๊ด๊ณ๋ก ๋ฌธ์ ์ค๋ช
์ ์๋ตํฉ๋๋ค.
โ๏ธIdea Sketch
2021-06-28
1. ์ธ์ ํ ๋ง ์ฌ์ด์ ๊ฑฐ๋ฆฌ๊ฐ ์ต๋๊ฐ ๋๋๋ก, ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ๋ง์ ์ต๋๊ฑฐ๋ฆฌ
- 3๋ง๋ฆฌ ๋ง์ ๋ฐฐ์น
- 1, 4, 9๋ก ๋ฐฐ์นํ ๊ฒฝ์ฐ ์ธ์ ํ ๋ง ์ฌ์ด์ ๊ฑฐ๋ฆฌ๊ฐ ์ต๋
- ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ๋ง์ ์ต๋๊ฑฐ๋ฆฌ๋ 4-1 = 3
2. ๋ ๋ง์ ์ต๋๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด์ผ ํ๋ฏ๋ก
- ๋ ๋ง ์ฌ์ด์ ๋ชจ๋ ์ข ๋ฅ์ ๊ฑฐ๋ฆฌ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก, ์ด๋ถ๊ฒ์
- left, right๋ ๋ณด๋ค ๋จ์ํ๊ฒ ๊ตฌํ
- ๋ ๋ง ์ฌ์ด์ ์ต์๊ฑฐ๋ฆฌ๋ฅผ mid๋ผ ํ์ ๋, ๋ง๊ตฌ๊ฐ์ ๋ฃ์ ์ ์๋ ๋ง์ ์ด ๋ช๋ง๋ฆฌ์ธ์ง ํ์ธ
let left = Math.min(...arr), right = Math.max(...arr);
while (left <= right) {
let mid = Math.floor((left + right) / 2);
let cnt = count(arr, target);
if (cnt === mid) return mid;
else if (cnt < mid) right = mid-1; // 2๋ง๋ฆฌ๋ฐ์ ๋ชป๋ฃ์, ๊ทธ ๋ง์ ์ต์๊ฑฐ๋ฆฌ๊ฐ ์ ๋ต๋ณด๋ค ํฌ๋ค๋ ๋ง, ์ต์๊ฑฐ๋ฆฌ๋ฅผ ์ค์ฌ์ผ ํจ
else if (cnt > mid) left = mid+1;
}
3. if (cnt === mid) ์ธ ๊ฒฝ์ฐ ๋ฌด์กฐ๊ฑด return ํ๋ฉด ์๋๋ค.
- mid-1, mid-2, โฆ ๋ ๋ฌธ์ ์กฐ๊ฑด์ ๋ง์กฑํ ์ ์๋ค.
if (cnt <= mid) {
res = mid;
right = mid-1;
}
else if (cnt > mid) left = mid+1;
4. count(arr, mid) ๊ตฌํ
- ๋ง ์ฌ์ด์ ์ต์๊ฑฐ๋ฆฌ๊ฐ mid์ผ ๋, ๋ง๊ตฌ๊ฐ์ ๋ฃ์ ์ ์๋ ๋ง์ด ๋ช๋ง๋ฆฌ์ธ์ง return
- ์ด๊ธฐ๊ฐ cnt = 1, index = arr[0];
- arr[i]๊ฐ index + mid๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด cnt++, index = arr[i]
function count(arr, mid) {
let cnt = 1, index = arr[0];
for (let i=1; i<arr.length; i++) {
if (arr[i] >= index + mid) {
cnt++;
index = arr[i];
}
}
return cnt;
}
โ๏ธ์์ค์ฝ๋
2021-06-28
function count(arr, mid) {
let cnt = 1, index = arr[0];
for (let i=1; i<arr.length; i++) {
if (arr[i] >= index + mid) {
cnt++;
index = arr[i];
}
}
return cnt;
}
function solution(arr, target) {
let res = 0;
arr.sort((a, b) => a-b);
let left = arr[0], right = arr[arr.length-1];
// ์ ๋ ฌ์ด ํ์์๋ค๋ฉด let left = Math.min(...arr), right = Math.max(...arr);
while (left <= right) {
let mid = Math.floor((left + right) / 2);
let cnt = count(arr, target);
if (cnt <= mid) {
res = mid;
right = mid-1;
}
else if (cnt > mid) left = mid+1;
}
return res;
}