문제 개요
숫자로 이루어진 배열을 입력받아, 배열 안에 있는 모든 세 자리 정수(100~999)를 배열의 맨 앞으로 이동시키는 JavaScript 함수를 작성해야 합니다.
예를 들어 다음과 같은 숫자 배열이 있다고 가정해 보겠습니다.
const numList = [1, 324, 34, 3434, 304, 2929, 23, 444];
함수 실행 후에는 세 자리 숫자(324, 304, 444)가 모두 배열 앞쪽으로 옮겨져야 합니다.
해결 아이디어
이 문제는 배열 메서드 두 개만으로 손쉽게 해결할 수 있습니다.
- splice(i, 1): 인덱스 i에 있는 요소를 배열에서 제거하고, 제거된 요소를 반환합니다.
- unshift(): 전달된 요소를 배열의 맨 앞에 추가합니다.
즉, 배열을 처음부터 끝까지 순회하면서 세 자리 숫자를 만날 때마다 해당 요소를 잘라낸 뒤 배열 맨 앞에 삽입하면 됩니다.
구현 코드
먼저, 숫자가 세 자리인지 판별하는 헬퍼 함수를 정의합니다. 세 자리 수는 99보다 크고 1000보다 작은 수입니다.
const numList = [1, 324, 34, 3434, 304, 2929, 23, 444];
// 세 자리 숫자 여부 확인
const isThreeDigit = num => num > 99 && num < 1000;
// 세 자리 숫자를 배열 맨 앞으로 이동
const bringToFront = arr => {
for(let i = 0; i < arr.length; i++){
if(!isThreeDigit(arr[i])){
continue;
};
arr.unshift(arr.splice(i, 1)[0]);
};
};
bringToFront(numList);
console.log(numList);실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
[ 444, 304, 324, 1, 34, 3434, 2929, 23 ]
동작 원리 살펴보기
순회 중 세 자리 숫자를 발견하면 splice(i, 1)로 해당 요소를 제거하고, 반환값은 배열 형태이므로 [0]으로 실제 값을 꺼낸 후 unshift()로 맨 앞에 삽입합니다. 나머지 요소들은 자동으로 한 칸씩 밀려나기 때문에 별도의 인덱스 조정 없이도 전체 순회가 정상적으로 진행됩니다.
참고로, 새로운 요소가 항상 맨 앞에 삽입되기 때문에 세 자리 숫자들 사이의 원래 순서는 역순으로 바뀌게 됩니다. 원래 순서를 유지하고 싶다면 필터링 후 세 자리 숫자 배열과 그 외 숫자 배열을 합치는 방식(filter + concat)을 사용하는 것이 좋습니다.