
const fs = require('fs');
const path = process.platform === 'linux' ? '/dev/stdin' : 'Wiki\\input.txt';
const [n, k, ...inputs] = fs
.readFileSync(path)
.toString()
.trim()
.split('\n')
.map((it) => it.split(' ').map(Number))
.flat();
const sensors = inputs.sort((a, b) => a - b);
let diff = [];
for (let i = 1; i < n; i++) {
diff.push(sensors[i] - sensors[i - 1]);
}
diff = diff.sort((a, b) => a - b).filter((it) => it !== 0);
for (let i = 0; i < k - 1; i++) {
if (diff.length > 0) diff.pop();
}
if (diff.length === 0) console.log(0);
else console.log(diff.reduce((pre, cur) => pre + cur));
⏰ 소요한 시간 : -
첫 예시 1 3 6 7 9 로 봤을 때 13, 679 이렇게 묶으면 결과인 5가 된다. 이렇게 묶은 이유는 3과 6사이의 거리가 제일 멀기 때문이다. 따라서 나는 각 수의 간격을 확인해야 한다고 생각했고 간격을 확인해 보면 2, 3, 1, 2가 된다. 여기서 간격이 3인 부분만 분리해주면 정답이 된다. 그래서 나는 각 수의 간격을 확인해야 한다고 생각했다.
입력받은 inputs을 정렬해서 sensers 변수에 담았고, sensers의 값을 순회하면서 차이값을 diff 배열에 담아주었다.
그 후 diff 배열을 정렬해주고 filter메서드를 통해 0인부분 즉 똑같은 수가 2번 나와 간격이 1이 되는 경우를 제거해준다.
그 후 k-1번 pop을 해주면 된다. k-1인 경우는 2개로 묶으면 간격이 1개가 되고, 5개로 묶으면 간격이 4개가 되기 때문이다. 따라서 k개의 집중국을 설치하기 위해서는 k-1개의 간격을 만들면되고 간격을 젤 좁게해야 되므로 큰 간격을 제거해주면 된다.
이 때 diff길이가 0보다 클때라는 조건을 넣어줘서 런타임 에러를 방지한다.