Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript 배열에서 중복 없는 고유 문자열 찾기

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;

이 방식은 코드가 짧아질 뿐만 아니라 가독성도 뛰어나므로, 실무에서 유용하게 활용할 수 있습니다.