문제 개요
정수 두 개씩 담긴 하위 배열들로 구성된 배열을 입력받아, 하위 배열 내부의 요소까지 모두 고려해 전체를 오름차순으로 정렬한 새로운 배열을 반환하는 JavaScript 함수를 작성해야 합니다.
즉, 흩어져 있는 모든 숫자를 하나로 모아 정렬한 뒤, 다시 두 개씩 짝지어 하위 배열 형태로 재구성하면 됩니다.
예시
입력 배열이 다음과 같다고 가정해 보겠습니다.
const arr = [
[4, 2],
[6, 1],
[5, 3]
];
이때 기대되는 출력 결과는 다음과 같습니다.
const output = [
[1, 2],
[3, 4],
[5, 6]
];
[4, 2]처럼 원래 한 쌍이었던 숫자들이 서로 분리되더라도 상관없으며, 중요한 것은 전체 숫자가 오름차순으로 정렬된 상태에서 두 개씩 묶인다는 점입니다.
구현 방법
풀이 과정은 크게 세 단계로 나눌 수 있습니다.
첫째, 모든 하위 배열의 숫자를 하나의 임시 배열에 펼쳐 넣습니다. 둘째, 임시 배열을 오름차순으로 정렬합니다. 셋째, 정렬된 배열에서 인접한 두 숫자씩 묶어 새로운 하위 배열을 만들어 결과 배열에 추가합니다.
코드
const arr = [
[4, 2],
[6, 1],
[5, 3]
];
const sortWithin = (arr = []) => {
const res = [];
const temp = [];
for(let i = 0; i < arr.length; i++){
temp.push(...arr[i]);
};
temp.sort((a, b) => a - b);
for(let i = 0; i < temp.length; i += 2){
res.push([temp[i], temp[i+1]]);
};
return res;
};
console.log(sortWithin(arr));
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
[ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ] ]
동작 원리
temp.push(...arr[i])는 전개 연산자(spread operator)를 활용해 각 하위 배열의 요소들을 임시 배열에 개별적으로 추가합니다. 이후 sort((a, b) => a - b) 비교 함수를 사용해 문자열 정렬이 아닌 실제 숫자 크기순 정렬을 수행합니다. 마지막으로 인덱스를 2씩 증가시키며 인접한 두 숫자를 하나의 쌍으로 묶어 최종 결과 배열을 완성합니다.
참고로 ES2019 이상 환경이라면 arr.flat() 메서드를 사용해 중첩 배열을 한 번에 평탄화할 수도 있어, 첫 번째 반복문을 더 간결하게 대체할 수 있습니다.