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

JavaScript로 텍스트 문자열에서 가장 자주 등장하는 상위 3개 단어 찾기


문제 정의

영어 알파벳으로 이루어진 문자열을 입력받아, 해당 문자열 안에서 가장 빈도수가 높은 단어 세 개를 반환하는 JavaScript 함수를 작성해야 합니다.

예를 들어, 긴 영어 문단이 주어졌을 때 함수는 문장 부호와 대소문자를 적절히 처리한 뒤, 가장 많이 등장한 순서대로 상위 3개의 단어를 배열 형태로 돌려주어야 합니다.

예제 코드

다음은 실제 동작하는 전체 코드입니다.

const str = 'Python was developed by Guido van Rossum in the late eighties and early nineties at the National Research Institute for Mathematics and Computer Science in the Netherlands. Python is derived from many other languages, including ABC, Modula-3, C, C++, Algol-68, SmallTalk, and Unix shell and other scripting languages. Python is copyrighted. Python source code is now available under the GNU General Public License (GPL)';

const findTopThree = (str = '') => {
    // 특수 문자 제거 후 공백 정리, 소문자로 변환
    str = str
    .replace(/[^\w\s]|_/g, "")
    .replace(/\s+/g, " ")
    .toLowerCase();

    // 공백 기준으로 단어 분리
    const arr = str.split(' ');

    // 단어별 등장 횟수 집계
    const map = {};
    arr.forEach(word => {
        map[word] = (map[word] || 0) + 1;
    });

    // [단어, 빈도수] 형태의 배열로 변환 후 내림차순 정렬
    const res = Array.from(Object.keys(map), key => [key, map[key]]);
    res.sort((a, b) => b[1] - a[1]);

    // 상위 3개 단어만 반환
    return [res[0][0], res[1][0], res[2][0]];
};

console.log(findTopThree(str));

코드 동작 원리

이 코드는 크게 네 단계로 나누어 이해할 수 있습니다.

1. 문자열 정규화

정규식 /[^\w\s]|_/g를 사용해 쉼표, 마침표, 괄호 같은 특수 문자를 모두 제거합니다. 이어서 /\s+/g 패턴으로 연속된 공백을 하나의 공백으로 합치고, toLowerCase()로 모든 문자를 소문자로 바꿔 대소문자 차이로 인한 중복 집계를 방지합니다.

2. 단어 분리 및 빈도수 계산

split(' ')으로 문자열을 단어 배열로 만든 뒤, 객체(map)를 활용해 각 단어가 몇 번 등장했는지 카운트합니다. (map[word] || 0) + 1 표현식은 처음 등장한 단어는 1부터, 이미 존재하는 단어는 기존 값에 1을 더하는 방식으로 동작합니다.

3. 정렬

객체의 키-값 쌍을 [단어, 빈도수] 형태의 2차원 배열로 변환한 후, 빈도수를 기준으로 내림차순 정렬하여 가장 많이 등장한 단어가 앞쪽에 오도록 합니다.

4. 결과 반환

정렬된 배열에서 첫 번째부터 세 번째 요소까지의 단어만 추출해 배열로 반환합니다.

출력 결과

콘솔 실행 결과는 다음과 같습니다.

["python","the","and"]

예제 문단에서 'python'은 4번, 'the'와 'and'는 각각 여러 번 등장했기 때문에 이 세 단어가 상위 3개로 선정되었습니다.