올바른 배열이란 어떤 배열 속에 있는 원소 중 5개가 연속적인 것을 말한다. (연속적인 것이란 5개의 수를 정렬했을 때, 인접한 수의 차이가 1인 것을 말한다.)
예를 들어 배열 {6, 1, 9, 5, 7, 15, 8}은 올바른 배열이다. 왜냐하면 이 배열 속의 원소인 5, 6, 7, 8, 9가 연속이기 때문이다.
배열이 주어지면, 이 배열이 올바른 배열이 되게 하기 위해서 추가되어야 할 원소의 개수를 출력하는 프로그램을 작성하시오.
첫째 줄에 배열의 크기 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 배열의 원소가 한 줄에 하나씩 주어진다. 원소는 1,000,000,000보다 작거나 같은 음이 아닌 정수이다. 배열에 중복되는 수는 없다.
첫째 줄에 입력으로 주어진 배열이 올바른 배열이 되게 하기 위해서 추가되어야할 원소의 최소 개수를 출력한다.
3
5
6
7
2
출력값: 올바른 배열이 되기 위해 추가되어야할 원소의 최소 개수 출력
투 포인터 이용
1. start = 0, end = 1로 두고, 투 포인터 동작
2. 두 수(start와 end 인덱스의 수)의 차가
2-1. 4이하인 경우, 5-(end-start+1)개 원소 필요! end + 1
2-2. 5이상인 경우, 5-(end-start)개 원소 필요! start와 end 모두 1씩 증가
=> 위 과정을 end가 N 이하인 경우동안 반복하여 최소 개수 찾기
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split('\n');
const N = +input[0]; // 배열의 크기
const numbers = [];
for (let i = 1; i <= N; i++) numbers.push(+input[i]); // 배열
numbers.sort((a, b) => a - b); // 오름차순 정렬
let [start, end] = [0, 1]; // 투 포인터 시작값
let minCnt = 4; // 필요한 원소의 최댓값
while (end < N) {
const sub = numbers[end] - numbers[start]; // 두 수의 차
if (sub <= 4) {
minCnt = Math.min(minCnt, 5 - (end - start + 1));
end++;
} else {
minCnt = Math.min(minCnt, 5 - (end - start));
start++;
end++;
}
}
console.log(minCnt);