728x90
https://www.acmicpc.net/problem/2110
2110번: 공유기 설치
첫째 줄에 집의 개수 N (2 ≤ N ≤ 200,000)과 공유기의 개수 C (2 ≤ C ≤ N)이 하나 이상의 빈 칸을 사이에 두고 주어진다. 둘째 줄부터 N개의 줄에는 집의 좌표를 나타내는 xi (0 ≤ xi ≤ 1,000,000,000)가
www.acmicpc.net
문제
도현이의 집 N개가 수직선 위에 있다. 각각의 집의 좌표는 x1, ..., xN이고, 집 여러개가 같은 좌표를 가지는 일은 없다.
도현이는 언제 어디서나 와이파이를 즐기기 위해서 집에 공유기 C개를 설치하려고 한다. 최대한 많은 곳에서 와이파이를 사용하려고 하기 때문에, 한 집에는 공유기를 하나만 설치할 수 있고, 가장 인접한 두 공유기 사이의 거리를 가능한 크게 하여 설치하려고 한다.
C개의 공유기를 N개의 집에 적당히 설치해서, 가장 인접한 두 공유기 사이의 거리를 최대로 하는 프로그램을 작성하시오.
입력
첫째 줄에 집의 개수 N (2 ≤ N ≤ 200,000)과 공유기의 개수 C (2 ≤ C ≤ N)이 하나 이상의 빈 칸을 사이에 두고 주어진다. 둘째 줄부터 N개의 줄에는 집의 좌표를 나타내는 xi (0 ≤ xi ≤ 1,000,000,000)가 한 줄에 하나씩 주어진다.
출력
첫째 줄에 가장 인접한 두 공유기 사이의 최대 거리를 출력한다.
예제 입력 1
5 3
1
2
8
4
9
예제 출력 1
3
Solve
- 파라메트릭 서치를 활용하기 하여 오름차순으로 배열을 정렬하였습니다.
- 공유기 사이의 거리의 최소값을 1로 (left), 최대값은 배열의 처음값과 마지막 값을 기준으로 잡았습니다.
- 최대한 많은 곳에 공유기를 설치한다는 조건이어서, 가장 첫 집에 공유기를 설치하는 것이 어떤 경우든 최대가 될 것이라고 생각했습니다. 그래서 첫 집을 기준으로하여 구해야 하는 공유기 사이의 최대거리(mid)를 더해가며, 공유기의 개수를 구해주었습니다.
Problem
- 파라메트릭 서치를 사용할 때마다 항상 반복문을 멈추는 조건에서 많은 고민을 합니다. 평소에 풀 때는 mid를 구해줄 때 Math.floor를 사용해서 정수가 아닌 값이 나올 때는 내림을 해줬었는데 콘솔로 디버깅을 하는 과정에서 올림을 해주어야 답이 도출되는 것을 확인하고 수정하였더니 정답이 나왔습니다.
- 왜 이러한 결과가 나오는지에 대해 조금 더 생각하고, 고민해봐야 할 것 같습니다.
Code
const input = require("fs").readFileSync("/dev/stdin").toString().trim().split("\n");
const [n, c] = input.shift().split(' ').map(el=>+el);
const arr = input.map(el=>+el);
arr.sort((a,b)=>a-b);
let left = 1;
let right = arr[n-1] - arr[0];
let mid = Math.ceil((left+right)/2);
while(left < right) {
let count = 1;
let min = arr[0] + mid;
for(let i = 1 ; i < n; i++) {
if(arr[i] >= min) {
count += 1;
min = arr[i] + mid;
}
};
if(count < c) {
right = mid-1;
} else {
left = mid;
}
mid = Math.ceil((left+right)/2);
}
console.log(mid);
'BOJ > Node.js' 카테고리의 다른 글
[BOJ / Node.js] 1302. 베스트셀러 (0) | 2023.03.05 |
---|---|
[BOJ / Node.js] 2792. 보석상자 (0) | 2023.03.04 |
[BOJ / Node.js] 2343. 기타 레슨 (0) | 2023.03.01 |
[BOJ / Node.js] 4779. 칸토어 집합 (0) | 2023.02.28 |
[BOJ / Node.js] 17829 222-풀링 (0) | 2023.02.27 |