이번 포스팅에서는 문자열 배열을 입력받아, 같은 첫 글자로 시작하는 문자열 중 하나를 삭제하는 JavaScript 함수를 작성해 보겠습니다.
예를 들어 다음과 같은 배열이 있다고 가정해 봅시다.
const arr = ['Apple', 'Jack', 'Army', 'Car', 'Jason'];
위 배열에서 'Apple'과 'Army'는 모두 'A'로 시작하고, 'Jack'과 'Jason'은 모두 'J'로 시작합니다. 따라서 각 그룹에서 하나의 문자열만 남기고 나머지는 삭제해야 합니다. 즉, 결과적으로 각 첫 글자에 해당하는 문자열은 배열에 하나씩만 존재하게 됩니다.
구현 코드
이 로직을 구현하기 위해 Map 객체를 활용할 수 있습니다. 이미 등장한 첫 글자를 Map에 기록해 두고, 이후 같은 첫 글자를 가진 요소가 발견되면 배열에서 제거하는 방식입니다.
const arr = ['Apple', 'Jack', 'Army', 'Car', 'Jason'];
const deleteSameLetterWord = arr => {
const map = new Map();
arr.forEach((el, ind) => {
if(map.has(el[0])){
arr.splice(ind, 1);
}else{
map.set(el[0], true);
};
});
};
deleteSameLetterWord(arr);
console.log(arr);코드 설명
- 빈
Map객체를 생성하여 이미 확인한 첫 글자를 저장합니다. forEach로 배열을 순회하면서 각 요소의 첫 글자(el[0])가 Map에 존재하는지 검사합니다.- 첫 글자가 이미 존재하면
splice(ind, 1)로 해당 요소를 배열에서 제거합니다. - 존재하지 않는 경우에는 해당 첫 글자를 Map에 등록합니다.
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
[ 'Apple', 'Jack', 'Car' ]
'Army'와 'Jason'이 각각 'A'와 'J'로 시작하는 중복 항목으로 판단되어 삭제된 것을 확인할 수 있습니다.
참고: filter를 활용한 대안 방법
splice는 순회 중 배열을 직접 수정하기 때문에 인덱스 관리에 주의해야 합니다. 원본 배열을 유지하면서 새로운 배열을 만들고 싶다면 filter를 사용하는 것이 더 안전합니다.
const arr = ['Apple', 'Jack', 'Army', 'Car', 'Jason'];
const seen = new Set();
const result = arr.filter(el => {
if(seen.has(el[0])) return false;
seen.add(el[0]);
return true;
});
console.log(result); // [ 'Apple', 'Jack', 'Car' ]이 방식은 시간 복잡도 면에서도 효율적이며, 가독성이 뛰어나 실무에서 널리 사용됩니다. 상황에 맞게 두 방법 중 적절한 것을 선택하시면 됩니다.