문제
문자열 배열을 입력받아, 각 문자열 안에서 연속해서 나타나는 중복 문자를 제거한 새로운 문자열 배열을 반환하는 JavaScript 함수를 작성해야 합니다.
예를 들어 "kelless"에는 ll, ss처럼 연속된 문자가 포함되어 있으므로, 각각 하나씩만 남겨 "keles"로 만들어야 합니다.
해결 방법
다음은 reduce 메서드를 활용한 구현 예시입니다.
const arr = ["kelless", "keenness"];
const removeConsecutiveDuplicates = (arr = []) => {
const map = [];
const res = [];
arr.map(el => {
el.split('').reduce((acc, value, index, arr) => {
if (arr[index] !== arr[index+1]) {
map.push(arr[index]);
}
if (index === arr.length-1) {
res.push(map.join(''));
map.length = 0;
}
}, 0);
});
return res;
}
console.log(removeConsecutiveDuplicates(arr));출력 결과
[ 'keles', 'kenes' ]
코드 동작 원리
- 임시 버퍼 준비:
map배열은 현재 문자열에서 조건을 통과한 문자를 임시로 모으고,res배열은 최종 결과를 저장합니다. - 문자 단위 순회: 각 문자열을
split('')으로 개별 문자 배열로 변환한 뒤reduce로 순회합니다. - 중복 판별: 현재 문자
arr[index]가 다음 문자arr[index + 1]과 다를 때만map에 추가합니다. 덕분에 연속된 중복 문자 중 첫 번째 하나만 남게 됩니다. - 결과 저장: 마지막 인덱스에 도달하면 모아 둔 문자를
join('')으로 합쳐res에 넣고, 다음 문자열을 위해map을 비웁니다.
정규식을 활용한 더 간결한 방법
정규식을 사용하면 같은 로직을 훨씬 짧은 코드로 구현할 수 있습니다.
const removeConsecutiveDuplicates = (arr = []) => arr.map(str => str.replace(/(.)\1+/g, '$1')); console.log(removeConsecutiveDuplicates(["kelless", "keenness"])); // [ 'keles', 'kenes' ]
(.)\1+ 패턴은 "임의의 한 문자가 바로 뒤에서 한 번 이상 반복되는 경우"를 의미하며, 이를 캡처된 첫 번째 문자($1)로 치환해 연속 중복을 제거합니다.
마무리
두 방법 모두 동일한 결과를 반환하지만, 정규식 방식이 코드가 더 간결하고 가독성이 뛰어납니다. 또한 반환값을 활용하지 않는 반복 작업에서는 map보다 forEach나 for...of 문을 사용하는 것이 의도를 명확히 드러내는 좋은 코딩 습관입니다.