문자열을 입력받아 해당 문자열에서 두 번째로 많이 등장하는 문자를 반환하는 JavaScript 함수를 작성해야 합니다.
예를 들어, 다음과 같은 문자열이 주어졌다고 가정해 보겠습니다.
const str = 'Hello world, I have never seen such a beautiful weather in the world';
이 문자열에서 가장 많이 등장하는 문자는 공백(' ')이고, 그다음으로 많이 등장하는 문자는 'e'입니다. 따라서 함수의 결과값은 'e'가 되어야 합니다.
구현 방법
이 문제는 다음 단계로 해결할 수 있습니다.
- 객체(맵)를 사용하여 각 문자의 등장 횟수를 계산합니다.
- 등장 횟수 데이터를 배열 형태로 변환합니다.
- 등장 횟수를 기준으로 내림차순 정렬합니다.
- 정렬된 배열에서 두 번째 요소의 문자를 반환합니다.
코드 예제
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));실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
e
코드 설명
핵심 로직을 살펴보면 다음과 같습니다.
- 빈도 계산:
(map[str[i]] || 0) + 1패턴을 사용해 이미 존재하는 문자는 횟수를 1 증가시키고, 처음 등장한 문자는 1로 초기화합니다. - 정렬:
sort((a, b) => b[1] - a[1])를 통해 등장 횟수가 높은 순서대로 정렬합니다. - 결과 추출: 정렬 후 인덱스 1(두 번째 위치)에 있는 문자를 반환합니다.
참고로 이 구현은 대소문자와 공백을 모두 별개의 문자로 취급합니다. 만약 대소문자를 구분하지 않으려면 str.toLowerCase()를 먼저 적용하면 됩니다.