문제 정의
양의 정수 n(n > 0)을 입력받아 처리하는 JavaScript 함수를 작성해야 합니다. 이 함수의 목표는 주어진 숫자를 홀수 또는 짝수 자릿수가 연속되는 구간별로 나누어 배열 형태로 반환하는 것입니다. 다시 말해, 숫자를 왼쪽부터 오른쪽으로 훑어가며 인접한 자릿수의 홀짝 성질이 바뀌는 지점(홀수 → 짝수 또는 짝수 → 홀수)을 기준으로 숫자를 분할하면 됩니다.
접근 방식
예를 들어 입력값이 124579라고 가정해 보겠습니다.
- 1 — 홀수
- 2, 4 — 짝수가 연속됨
- 5, 7, 9 — 홀수가 연속됨
따라서 최종 결과는 [1, 24, 579]가 되어야 합니다. 핵심 아이디어는 각 자릿수를 2로 나눈 나머지(% 2)를 비교하여 홀짝 여부를 판단하고, 성질이 바뀔 때마다 지금까지 쌓아 온 값을 하나의 그룹으로 확정하는 것입니다.
구현 코드
다음은 위 로직을 구현한 코드입니다 −
const num = 124579;
const splitDifferent = (num = 1) => {
const str = String(num);
const res = [];
let temp = '';
for(let i = 0; i < str.length; i++){
const el = str[i];
if(!temp || +temp[temp.length - 1] % 2 === +el % 2){
temp += el;
}else{
res.push(+temp);
temp = el;
};
};
if(temp){
res.push(+temp);
temp = '';
};
return res;
};
console.log(splitDifferent(num));
출력 결과
[ 1, 24, 579 ]
코드 동작 원리
코드의 흐름을 단계별로 살펴보면 다음과 같습니다.
1단계 — 문자열 변환: String(num)을 통해 숫자를 문자열로 바꾸면 각 자릿수에 인덱스로 개별 접근할 수 있습니다.
2단계 — 홀짝 비교: 반복문 안에서 현재 자릿수(el)와 임시 버퍼(temp)의 마지막 자릿수를 각각 % 2 연산하여 비교합니다. 두 값이 같으면 같은 그룹이므로 temp에 이어 붙입니다.
3단계 — 그룹 확정: 홀짝이 다른 자릿수를 만나면, 지금까지 쌓인 temp를 숫자로 변환(+temp)해 결과 배열(res)에 넣고, temp를 새 자릿수로 초기화합니다.
4단계 — 마지막 그룹 처리: 반복문 종료 후 temp에 값이 남아 있다면 마지막 그룹이므로 결과 배열에 추가합니다.
이 알고리즘은 각 자릿수를 한 번씩만 순회하므로 시간 복잡도는 O(n)이며, 숫자의 길이에 비례해 선형적으로 동작합니다.