JavaScript로 배열을 다루다 보면 특정 조건을 만족하는 요소를 찾아야 하는 경우가 자주 있습니다. 이번 글에서는 중복된 문자가 하나도 없는 문자열, 즉 모든 문자가 고유한 첫 번째 문자열을 배열에서 찾는 방법을 알아보겠습니다.
문제 상황
다음과 같이 문자열들이 담긴 배열이 있다고 가정해 보겠습니다.
const arr = ['54gdgdfe3', '434ffd', '43frdf', '43fdhnh', 'wgcxhjny', 'fsdf34'];
여기서 우리가 작성해야 할 함수의 요구 사항은 다음과 같습니다.
- 배열을 순서대로 확인하면서 중복 문자가 전혀 없는 첫 번째 문자열을 찾아 반환합니다.
- 만약 조건을 만족하는 문자열이 하나도 없다면
false를 반환합니다.
해결 방법
핵심 아이디어는 간단합니다. 각 문자열에 대해 문자의 첫 번째 등장 위치(indexOf)와 마지막 등장 위치(lastIndexOf)가 같은지 확인하면 됩니다. 두 값이 같다는 것은 해당 문자가 문자열 내에서 단 한 번만 나타난다는 의미입니다.
먼저, 문자열이 고유한 문자들로만 이루어져 있는지 검사하는 헬퍼 함수를 만듭니다.
const isUnique = str => {
return str.split('').every(el =>
str.indexOf(el) === str.lastIndexOf(el)
);
};split('')으로 문자열을 개별 문자 배열로 만든 뒤, every() 메서드를 사용해 모든 문자가 위 조건을 통과하는지 검사합니다. 하나라도 중복되는 문자가 있다면 false가 반환됩니다.
이제 이 헬퍼 함수를 활용해 배열을 순회하며 조건을 만족하는 첫 번째 문자열을 찾는 메인 함수를 작성합니다.
const findUniqueString = arr => {
for (let i = 0; i < arr.length; i++) {
if (isUnique(arr[i])) {
return arr[i];
}
}
return false;
};전체 코드 및 실행 결과
위 코드를 하나로 합치면 다음과 같습니다.
const arr = ['54gdgdfe3', '434ffd', '43frdf', '43fdhnh', 'wgcxhjny', 'fsdf34'];
const isUnique = str => {
return str.split('').every(el =>
str.indexOf(el) === str.lastIndexOf(el)
);
};
const findUniqueString = arr => {
for (let i = 0; i < arr.length; i++) {
if (isUnique(arr[i])) {
return arr[i];
}
}
return false;
};
console.log(findUniqueString(arr));콘솔에 출력되는 결과는 다음과 같습니다.
wgcxhjny
결과 분석
앞의 네 문자열('54gdgdfe3', '434ffd', '43frdf', '43fdhnh')은 모두 중복된 문자를 포함하고 있어 조건에서 제외됩니다. 반면 다섯 번째 요소인 'wgcxhjny'는 w, g, c, x, h, j, n, y가 모두 한 번씩만 등장하므로 최종 결과로 반환됩니다.
참고: Set을 활용한 대안
ES6의 Set을 사용하면 더 간결하게 중복 여부를 판별할 수도 있습니다. Set은 중복 값을 저장하지 않으므로, 문자열을 Set으로 변환했을 때 크기가 원래 문자열의 길이와 같다면 모든 문자가 고유하다는 뜻입니다.
const isUnique = str => new Set(str).size === str.length;
이 방식은 코드가 짧아질 뿐만 아니라 가독성도 뛰어나므로, 실무에서 유용하게 활용할 수 있습니다.