๐ section07 - 12 - ๋ง๊ตฌ๊ฐ ์ ํ๊ธฐ(๊ฒฐ์ ์๊ณ ๋ฆฌ์ฆ)
๋ฌธ์ : N
๊ฐ์ ๋ง๊ตฌ๊ฐ์ด ์์ง์ ์์ ์๋ค. ๊ฐ ๋ง๊ตฌ๊ฐ์ x1, x2, x3, ..., xN
์ ์ขํ๋ฅผ ๊ฐ์ง๋ฉฐ ๋ง๊ตฌ๊ฐ ๊ฐ์ ์ขํ๊ฐ ์ค๋ณต๋๋ ์ผ์ ์๋ค. ํ์๋ C
๋ง๋ฆฌ์ ๋ง์ ๊ฐ์ง๊ณ ์๋๋ฐ, ์ด ๋ง๋ค์ ์๋ก ๊ฐ๊น์ด ์๋ ๊ฒ์ ์ข์ํ์ง ์๋๋ค. ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ๋ง์ ๊ฑฐ๋ฆฌ๊ฐ ์ต๋๊ฐ ๋๊ฒ ๋ง์ ๋ง๊ตฌ๊ฐ์ ๋ฐฐ์นํ๊ณ ์ถ๋ค.
์
๋ ฅ: ์ฒซ์งธ์ค์ ์์ฐ์ N
๊ณผ C
์ ๊ณต๋ฐฑ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๊ณ ๋์งธ์ค์ ๋ง๊ตฌ๊ฐ์ ์ขํ๊ฐ ์ฐจ๋ก๋ก ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ: ์ฒซ ์ค์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ๋ง์ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํ์์ค.
// ์
๋ ฅ
5 3
1 2 8 4 9
// ์ถ๋ ฅ
3
์ด ๋ฌธ์ ๋ฅผ ์ Parametric Search
์ผ๋ก ํ์ด์ผ ํ๋์ง ์๊ฐํด๋ณด๋ฉด, ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ๋ง์ ๊ฑฐ๋ฆฌ๊ฐ ์ต๋๊ฐ ๋ ๋๊น์ง ์ต์ ์ ํด๋ฅผ ๊ณ์ ์ฐพ์์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์๋ฅผ ๋ค์ด, ๋ ๋ง์ ๊ฑฐ๋ฆฌ(์ถ๋ ฅ)๊ฐ 2
๋ผ๊ณ ๊ฐ์ ํ๋ฉด, C
๋ง๋ฆฌ์ ๋ง์ ๋ง๊ตฌ๊ฐ์ ์ขํ ๋ด์ ๋ชจ๋ ๋ฐฐ์นํ ์ ์๋ค. ํ์ง๋ง, ์ด๊ฒ์ด ์ต์ ์ ๋ต์ธ๊ฐ?๋ฅผ ๊ณ ๋ฏผํ๋ฉด ๊ทธ๋ ์ง ์๋ค. ์๋๋ฉด 3
๋ ๋ง๊ตฌ๊ฐ์ ์ขํ ๋ด์ ๋ชจ๋ ๋ฐฐ์น ํ ์ ์์๊ณผ ๋์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ๋ง์ ๊ฑฐ๋ฆฌ๊ฐ ์ต๋๊ฐ ๋๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง, 4
๊ฐ ๋๋ฉด ์์ง์ ์์ ์ต๋ 2๋ง๋ฆฌ๊น์ง ๋ฐ์ ๋ฐฐ์นํ ์ ์๋ค. ์ด์ฒ๋ผ ๋ ์ด์ ํด๋ฅผ ์ฐพ์ ์ ์์ ๋๊น์ง ๊ณ์ ์ต์ ์ ํด๋ฅผ ๊ฐฑ์ ํด์ผ ํ๋ฏ๋ก Parametric Search
๋ฅผ ์ด์ฉํด์ผํ๋ค. ๋ณดํต ๋ฒ์ ๋ด ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ต์ / ์ต๋
๊ฐ์ ์ฐพ๋ ๋ฌธ์ ๊ฑฐ๋, n
์ ๊ฐ์ด ๋๋ฌด ํฌ๊ณ ์ ๋ ฌ์ ํตํด ๋ต์ ์ฐพ๋๋ค๋ฉด Parametric Search
๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค. ๋ก์ง์ ๋ค์๊ณผ ๊ฐ๋ค.
1. ๊ฐ์ฅ ๊ฐ๊น์ด ๋ง์ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ์ ๋๊น์ง ์ต์ ์ ํด๋ฅผ ๊ณ์ ๊ฐฑ์ ํ๋ค.
2. ์ฃผ์ด์ง ์ขํ๋ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด ์์ด์ผ ๋ง ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ์ ์๋ค.
3. lt
์ rt
๋ ๋ง ์ฌ์ด์ ๊ฑฐ๋ฆฌ์ธ๋ฐ lt
๋ ๋ง์ ์ต์๊ฑฐ๋ฆฌ์ธ 1์ด๊ณ , rt
๋ ๋ง์ ์ต๋๊ฑฐ๋ฆฌ์ธ arr[arr.length-1]
์ด๋ค.
4. ๋ง ์ฌ์ด์ ๊ฑฐ๋ฆฌ (mid
)๊ฐ ๊ฐ๊น์ธ์๋ก ๋ง์ ๋ ๋ง์ด ๋ฐฐ์นํ ์ ์๋ค. ์ด๋, cnt(๊ฑฐ๋ฆฌ์ ๋ฐ๋ผ ๋ฐฐ์นํ ๋ง์ ์)
๊ฐ ๋ฌ๋ผ์ง๊ฒ ๋๋๋ฐ, ์ด๋ c
๋ณด๋ค ๊ฐ๊ฑฐ๋ ํฌ๋ฉด ์ฃผ์ด์ง ์์ง์ ์์์๋ ๋ง์ ๋ ๋ง์ด ๋ฐฐ์นํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ต์ด ๋ ์ ์๋ค. ํ์ง๋ง c
์ ๊ฐ์ง ์๊ธฐ ๋๋ฌธ์ ๊ฑฐ๋ฆฌ๋ฅผ ๋๋ ค์ ํ์ํ๋ค.(lt=mid+1
) ๋ฐ๋๋ก, cnt<c
์ผ ๋๋ ๋ง ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๋๋ฌด ํฌ๊ฒ ์ก์์ ์์ง์ ์์ ๋ง์ ๋ฐฐ์นํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฑฐ๋ฆฌ๋ฅผ ์ขํ์ผ ํ๋ค. (rt=mid-1
)
5. ๊ฑฐ๋ฆฌ๋ฅผ ๋ ์ด์ ์ขํ๊ฑฐ๋ ๋ํ ์ ์์ ๋ ๋ฐ๋ณต๋ฌธ์ ์ข ๋ฃํ๋ค.
let n = 5;
let c = 3;
let arr = [1, 2, 4, 8, 9];
console.log(solution(n, c, arr));
function solution(n, c, arr){
arr.sort((a, b) => a-b);
let lt = 1;
let rt = arr[arr.length-1];
let answer;
while (lt <= rt){
let mid = Math.floor((lt+rt)/2);
let cnt=1;
let endPoint = arr[0]
for (let i=1; i<n; i++){
if (arr[i]-endPoint >= mid){
cnt++;
endPoint=arr[i]
}
}
if (cnt >= c){
answer=mid;
lt=mid+1;
}else rt=mid-1
}
return answer;
}
๋๊ธ