이 문제에서 문장(sentence)은 영어 알파벳과 문장 부호를 포함하는 문자열로 정의하며, 단어(word)는 그 문장 안에서 공백으로 구분되는 부분 문자열을 의미합니다.
우리가 작성해야 할 JavaScript 함수는 다음과 같이 동작해야 합니다.
- 첫 번째 인자로 문장 문자열
str을 받고, 두 번째 인자로 숫자num을 받습니다. - 함수는 먼저 문장 내 각 단어의 출현 빈도를 계산합니다.
- 그다음, 빈도가 높은 순서(내림차순)대로 정렬하여 가장 빈번한
num개의 단어를 배열로 반환합니다.
예시
예를 들어, 입력 문장과 숫자가 다음과 같다고 해보겠습니다.
const str = 'i am a good coder and i know that i can solve a problem'; const num = 2;
이 경우 기대되는 출력 결과는 다음과 같습니다.
const output = ['i', 'a'];
'i'는 3번, 'a'는 2번 등장하기 때문에 이 두 단어가 해당 문자열에서 가장 많이 사용된 상위 2개의 단어이기 때문입니다.
구현 코드
위 요구 사항을 충족하는 코드는 다음과 같습니다.
const str = 'i am a good coder and i know that i can solve a problem';
const num = 2;
const findMostFrequent = (str = '', num = 1) => {
const strArr = str.split(' ');
const map = {};
strArr.forEach(word => {
if(map.hasOwnProperty(word)){
map[word]++;
}else{
map[word] = 1;
}
});
const frequencyArr = Object.keys(map).map(key => [key, map[key]]);
frequencyArr.sort((a, b) => b[1] - a[1]);
return frequencyArr.slice(0, num).map(el => el[0]);
};
console.log(findMostFrequent(str, num));
코드 설명
이 코드의 동작 과정을 단계별로 살펴보면 다음과 같습니다.
split(' ')을 사용해 문장을 공백 기준으로 나누어 단어 배열을 만듭니다.- 객체(map)를 이용해 각 단어의 출현 횟수를 카운트합니다.
Object.keys()로 단어와 빈도를 쌍으로 하는 배열을 생성한 뒤, 빈도를 기준으로 내림차순 정렬합니다.- 정렬된 배열에서 앞의
num개 요소만 잘라내어 단어 이름만 반환합니다.
출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
[ 'i', 'a' ]