백준_1337_올바른 배열

Minji Lee·6일 전
0

JS코딩테스트

목록 보기
140/141

올바른 배열

문제

올바른 배열이란 어떤 배열 속에 있는 원소 중 5개가 연속적인 것을 말한다. (연속적인 것이란 5개의 수를 정렬했을 때, 인접한 수의 차이가 1인 것을 말한다.)

예를 들어 배열 {6, 1, 9, 5, 7, 15, 8}은 올바른 배열이다. 왜냐하면 이 배열 속의 원소인 5, 6, 7, 8, 9가 연속이기 때문이다.

배열이 주어지면, 이 배열이 올바른 배열이 되게 하기 위해서 추가되어야 할 원소의 개수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 배열의 크기 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 배열의 원소가 한 줄에 하나씩 주어진다. 원소는 1,000,000,000보다 작거나 같은 음이 아닌 정수이다. 배열에 중복되는 수는 없다.

출력

첫째 줄에 입력으로 주어진 배열이 올바른 배열이 되게 하기 위해서 추가되어야할 원소의 최소 개수를 출력한다.

예제 입력 1

3
5
6
7

예제 출력 1

2

풀이 및 해설

출력값: 올바른 배열이 되기 위해 추가되어야할 원소의 최소 개수 출력

  • 올바른 배열 → 원소 5개가 연속인것(차이가 1이 나는 것)

투 포인터 이용
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 이하인 경우동안 반복하여 최소 개수 찾기

Code

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);

0개의 댓글