올바른 배열이란 어떤 배열 속에 있는 원소 중 5개가 연속적인 것을 말한다. (연속적인 것이란 5개의 수를 정렬했을 때, 인접한 수의 차이가 1인 것을 말한다.)
예를 들어 배열 {6, 1, 9, 5, 7, 15, 8}은 올바른 배열이다. 왜냐하면 이 배열 속의 원소인 5, 6, 7, 8, 9가 연속이기 때문이다.
배열이 주어지면, 이 배열이 올바른 배열이 되게 하기 위해서 추가되어야 할 원소의 개수를 출력하는 프로그램을 작성하시오.
첫째 줄에 배열의 크기 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 배열의 원소가 한 줄에 하나씩 주어진다. 원소는 1,000,000,000보다 작거나 같은 음이 아닌 정수이다. 배열에 중복되는 수는 없다.
첫째 줄에 입력으로 주어진 배열이 올바른 배열이 되게 하기 위해서 추가되어야할 원소의 최소 개수를 출력한다.
https://www.acmicpc.net/problem/1337 백준-올바른 배열
- 오름차순으로 정렬
- 연속된 값이 5개가 되는지 체크할 카운트, 만약 5개가 연속 안되었을때 몇개까지 연속이었는지 확인할 카운트 변수 2개 선언
- 반복문으로 다음 인덱스 값이 1 더 큰 수인지 확인
- 맞다면 카운트 +1, max카운트 업데이트, 틀리면 카운트 1으로 초기화
- 오름차순 정렬
- 배열 생성
- 반복문으로 다음 인덱스 값이 1 더 큰 수인지 확인
- 맞다면 새로 생성한 배열에 넣는다 틀리다면 배열 초기화
- 배열의 길이가 5가 되면 => 결과 출력
- 5 - 배열의 길이 값을 결과로 출력
let input = require('fs').readFileSync('/dev/stdin').toString().split('\n');
let answer = 0;
let numberList = Array.from(input.map(Number).sort((a, b) => a - b));
let currentCnt = 1;
let maxCnt = 1;
numberList.forEach((num,index) => {
if(typeof numberList[index+1] === 'undefined') return;
if((num + 1) === numberList[index+1]){
currentCnt += 1;
if(currentCnt > maxCnt) {
maxCnt = currentCnt;
if(maxCnt >= 5) return;
}
}else{
currentCnt = 1;
}
})
answer = 5 - maxCnt;
console.log(answer);
갯수 체크로 배열을 쓰는것은 메모리 적으로 손해라고 생각하여 변수로 체크하는 1번 방식을 채용

문제점
연속되지 않은 숫자가 나타났을 때의 처리:
currentCnt를 1로 초기화하는 것은 올바른 접근이지만, 이 방법은 연속된 숫자가 끊겼을 때마다 maxCnt를 다시 계산하게 만들며, 최종 결과에서 마지막에 연속된 숫자들을 제대로 계산하지 못할 수 있습니다.
초기값 처리:
maxCnt의 초기값이 1로 설정되어 있지만, 코드에서 연속된 숫자를 올바르게 계산하지 못하면 이 값이 잘못된 결과를 초래할 수 있습니다.
예시
예를 들어, [1, 2, 3, 7, 8]이라는 입력이 주어지면, 이 코드에 따라 계산하면 최대 연속된 숫자의 수는 3이 됩니다. 하지만 실제로는 5개의 숫자를 연속되게 채울 수 없습니다. 따라서, answer는 2가 되어야 하지만, 이 코드로는 제대로 동작하지 않을 수 있습니다.
let input = require('fs').readFileSync('/dev/stdin').toString().split('\n');
let answer = 0;
let numberList = Array.from(input.map(Number).sort((a, b) => a - b));
let maxCnt = 1;
for (let i = 0; i < numberList.length; i++) {
let count = 1;
for (let j = i + 1; j < numberList.length; j++) {
if (numberList[j] - numberList[i] < 5) {
count++;
} else {
break;
}
}
maxCnt = Math.max(maxCnt, count);
}
answer = 5 - maxCnt;
console.log(answer);
코드에서 if (numberList[j] - numberList[i] < 5)라는 조건을 사용하는 이유는, 두 숫자 numberList[i]와 numberList[j]가 연속된 숫자열에 포함될 수 있는지를 확인하기 위해서입니다.
numberList[j] - numberList[i] < 5는 i와 j 사이의 숫자들이 5개 이하의 연속된 숫자열을 형성할 수 있는지를 판단합니다.
-> 이부분 이해..
최대 연속된 숫자 갯수를 max를 사용하는 형태로 수정