JavaScript에서 문자열과 숫자 n(n은 문자열 전체 길이를 정확히 나눌 수 있는 값)을 입력받아, 해당 문자열을 n개의 동일한 길이의 조각으로 나눈 뒤 그 결과를 배열로 반환하는 함수를 작성해야 하는 경우가 있습니다. 예를 들어 길이가 48인 문자열을 6개 조각으로 나눈다면, 각 조각의 길이는 정확히 8자가 되어야 합니다.
예제 코드
다음은 reduce 메서드를 활용하여 문자열을 균등하게 분할하는 함수입니다.
const str = 'we will be splitting this string into parts';
const num = 6;
const divideEqual = (str, num) => {
const len = str.length / num;
const creds = str.split("").reduce((acc, val) => {
let { res, currInd } = acc;
if(!res[currInd] || res[currInd].length < len){
res[currInd] = (res[currInd] || "") + val;
}else{
res[++currInd] = val;
};
return { res, currInd };
}, {
res: [],
currInd: 0
});
return creds.res;
};
console.log(divideEqual(str, num));
코드 작동 원리
str.length / num을 계산하여 각 조각이 가져야 할 목표 길이(len)를 구합니다.split("")으로 문자열을 한 글자씩 배열로 변환한 뒤,reduce로 각 문자를 순회합니다.res는 최종 결과 배열을,currInd는 현재 채우고 있는 조각의 인덱스를 추적합니다.- 현재 조각의 길이가 목표 길이보다 짧으면 문자를 이어 붙이고, 목표 길이에 도달하면 인덱스를 하나 증가시켜 다음 조각을 채우기 시작합니다.
출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
[ 'we will ', 'be split', 'ting thi', 's string', ' into pa', 'rts' ]
더 간단한 대안: substring 활용
substring 메서드를 사용하면 동일한 기능을 훨씬 간결하게 구현할 수 있습니다.
const divideEqual = (str, num) => {
const len = str.length / num;
return Array.from({ length: num }, (_, i) =>
str.substring(i * len, (i + 1) * len)
);
};
console.log(divideEqual(str, num));
// [ 'we will ', 'be split', 'ting thi', 's string', ' into pa', 'rts' ]
Array.from으로 num개의 요소를 가진 배열을 생성하고, 각 인덱스 i마다 시작 위치와 끝 위치를 계산해 substring으로 잘라내는 방식입니다. 가독성이 좋고 불필요한 문자 순회가 없어 성능 면에서도 유리하기 때문에, 실무에서는 이 방식을 사용하는 것이 권장됩니다.