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

JavaScript로 문자열에서 두 번째로 자주 등장하는 문자 찾기 (공백 포함)

이번 글에서는 문자열을 인수로 받아 해당 문자열에서 두 번째로 자주 등장하는 문자를 반환하는 JavaScript 함수를 작성해 보겠습니다. 공백도 하나의 문자로 취급하여 빈도 계산에 함께 포함됩니다.

접근 방법

문제를 해결하는 과정은 다음과 같습니다.

  • 객체(map)를 만들어 각 문자별 등장 횟수를 누적합니다.
  • Object.keys()로 문자 목록을 가져온 뒤, [문자, 횟수] 형태의 2차원 배열로 변환합니다.
  • 횟수를 기준으로 내림차순 정렬합니다.
  • 정렬된 배열의 두 번째 요소(index 1)에 해당하는 문자를 반환합니다.

예제 코드

const str = 'Hello world, I have never seen such a beautiful weather in the world';

const secondFrequent = str => {
  const map = {};
  for (let i = 0; i < str.length; i++) {
    map[str[i]] = (map[str[i]] || 0) + 1;
  }
  const freqArr = Object.keys(map).map(el => [el, map[el]]);
  freqArr.sort((a, b) => b[1] - a[1]);
  return freqArr[1][0];
};

console.log(secondFrequent(str));

코드 설명

1. 문자별 빈도 계산

for 루프를 순회하면서 각 문자를 키로 하는 객체에 등장 횟수를 하나씩 더합니다. 이때 (map[str[i]] || 0) 표현식은 해당 문자가 처음 등장했을 경우 undefined 대신 0부터 카운트를 시작하도록 처리해 줍니다.

2. 배열 변환 및 정렬

Object.keys(map)으로 모든 문자의 목록을 얻고, map() 메서드로 [문자, 횟수] 쌍의 배열을 만듭니다. 이후 sort()를 사용해 횟수(b[1], a[1])를 기준으로 내림차순 정렬합니다.

3. 두 번째 요소 반환

배열이 내림차순으로 정렬되어 있으므로 index 0은 가장 많이 등장한 문자, index 1은 두 번째로 많이 등장한 문자를 의미합니다. 따라서 freqArr[1][0]을 반환하면 됩니다.

출력 결과

e

위 예제 문자열에서 가장 많이 등장한 문자는 공백(' ')이며, 그다음으로 많이 등장한 문자는 'e'입니다. 따라서 콘솔에는 'e'가 출력됩니다.

개선된 버전: 예외 상황 처리

문자열이 비어 있거나 서로 다른 문자가 2개 미만인 경우 freqArr[1]은 undefined가 되어 오류가 발생할 수 있습니다. 안전성을 높이려면 아래와 같이 조건 검사를 추가하는 것이 좋습니다.

const secondFrequentSafe = str => {
  if (!str || str.length < 2) return null;

  const map = {};
  for (let i = 0; i < str.length; i++) {
    map[str[i]] = (map[str[i]] || 0) + 1;
  }

  const freqArr = Object.keys(map).map(el => [el, map[el]])
    .sort((a, b) => b[1] - a[1]);

  return freqArr.length > 1 ? freqArr[1][0] : null;
};

console.log(secondFrequentSafe(str)); // 'e'
console.log(secondFrequentSafe('aa')); // null

이처럼 객체를 활용한 빈도 계산과 정렬만으로 문자열 내 두 번째로 빈번한 문자를 손쉽게 구할 수 있습니다.