문제 이해하기
숫자 배열을 입력받는 자바스크립트 함수를 작성해야 합니다. 이 함수의 역할은 배열의 요소들을 재배열했을 때 연속된 숫자 시퀀스를 만들 수 있는지 판별하는 것입니다.
예를 들어 다음과 같은 배열이 있다고 가정해 보겠습니다.
const arr = [3, 1, 4, 2, 5];
이 배열에는 1부터 5까지 모든 숫자가 포함되어 있으므로, 정렬하면 [1, 2, 3, 4, 5]가 되어 완벽한 연속 시퀀스를 형성할 수 있습니다. 따라서 출력 결과는 다음과 같아야 합니다.
true
구현 접근 방식
가장 직관적인 방법은 배열을 오름차순으로 정렬한 뒤, 각 요소가 첫 번째 값에서 시작해 1씩 증가하는 규칙을 따르는지 확인하는 것입니다. 반복문에서 인덱스 j와 예상값 i를 함께 증가시키며 두 값이 일치하는지 검사하면 됩니다.
예제 코드
const arr = [3, 1, 4, 2, 5];
const canBeConsecutive = (arr = []) => {
if(!arr.length){
return false;
};
const copy = arr.slice();
copy.sort((a, b) => a - b);
for(let i = copy[0], j = 0; j < copy.length; i++, j++){
if(copy[j] === i){
continue;
};
return false;
};
return true;
};
console.log(canBeConsecutive(arr));코드 상세 설명
- 빈 배열 처리: 배열이 비어 있으면 연속 시퀀스를 형성할 수 없으므로 false를 반환합니다.
- 원본 배열 보호: slice() 메서드로 배열을 복사하여 원본 데이터가 변경되지 않도록 합니다.
- 정확한 정렬: sort((a, b) => a - b)처럼 비교 함수를 전달해야 숫자 크기 기준으로 올바르게 정렬됩니다. 비교 함수 없이 sort()를 호출하면 문자열 기준으로 정렬되어 잘못된 결과가 나올 수 있습니다.
- 연속성 검사: 정렬된 배열의 각 요소가 시작값에서 1씩 증가하는 값과 일치하는지 확인하고, 하나라도 어긋나면 false를 반환합니다.
출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
true