[JavaScript] 단어수세기 구현 (split, 정규식)

김의진·2021년 10월 4일
1

오늘은 단어수세기를 구현해보겠습니다.
보통 한국어는 글자수를 기준으로, 영어는 단어수를 기준으로 셉니다

단어란

  1. [표준어국어대사전] 분리하여 자립적으로 쓸 수 있는 말이나 이에 준하는 말. 또는 그 말의 뒤에 붙어서 문법적 기능을 나타내는 말.
  2. 간단하게 말하면, 영어에서 띄어쓰기 단위와 같다. a, the, apple, is, new 등 모든 띄어쓰기 단위들이 단어이다.
  3. 하지만 . , ! @ # $ % & 등 특수문자만이 띄어쓰기 단위로 존재한다고 해서 이를 단어로 볼 수 없다.

단어수세기 구현 방법

  1. 띄어쓰기 단위로 잘라서 Array 화한다.
  2. Array의 각 요소들이 알파벳 또는 숫자를 포함한 것인지 검사한다.
  3. 알파벳 또는 숫자라면 단어수를 1 증가시키고, 모든 요소에 대해 시행한 후 결과값을 반환한다.
// JavaScript

function countWords(text) {    
    //단어수를 0으로 두고, 단어가 찾아질 때마다 1씩 증가시켜줄 것이다.
    wordCount=0;
    // 인수로 받아온 text를 trim() 하여 앞뒤 공백을 잘라내고,
    // split() 를 이용하여 띄어쓰기 단위로 나눠서 array로 만든다.
    // /\s+/란 정규식 표현인데, \s 는 공백, 줄바꿈 Tab등을 가리키고, +는 공백이 1개 이상인 모든 것을 말한다.
    // / / 안에 넣어주면 이를 정규식으로 인식한다.
    let arr = text.trim().split(/\s+/);
    
    // array의 모든 요소에 대해 단어인지 검사한다
    for (let i=0; i<arr.length; i++) {
        // isWord()는 단어 여부를 검사하는 함부로, 밑에 따로 작성한다.
        if (isWord(arr[i])) {
            // 단어가 맞다면, wordCount를 1 더해준다.
            wordCount++
        }
    // 최종적으로 단어의 개수를 return 한다.
    return wordCount
};

countWords 함수를 정의한다. 여기서 isWord라는 함수가 들어가있다.

function isWord(str) {
    // 알파벳 이나 숫자가 발견되었음을 나타내는 변수를 둔다
    let alphaNumericFound = false;
    
    // 단어중에서 알파벳, 숫자가 하나라도 발견되면 단어로 인식할 것이다.
    // 즉, 입니다. 그녀, 코딩! <- 이들은 특수문자가 섞여있지만, 단어이다.

    for (let i = 0; i < str.length; i++) {
        // 정규식 표현이다
        // 숫자표현 정규식 0-9
        // 알파벳표현 정규식 a-zA-z
        // 한글표현 정규식 ㄱ-ㅎㅏ-ㅣ가-힣
        // 이들을 연속하여 써주면 or 로 인식하여 "숫자이거나, 알파벳이거나, 한글이거나" 라는 의미로 해석된다.
        // .test() 는 괄호속 인자가 정규식을 만족하는지 검사하여 true or false 값을 반환한다.
        if (/[0-9a-zA-Zㄱ-ㅎㅏ-ㅣ가-힣]/.test(str[i])) {
            // true 라면, 변수를 true로 만들어준다.
            // 하나라도 알파벳이나 숫자가 있다면, 더 이상 검사할 필요가 없기에 return 하는게 효율적이다. 
            alphaNumericFound = true;
            return alphaNumericFound
        }
    }
    // 알파벳 or 숫자가 없었다면 false 값 그대로 return 될 것이다.
    return alphaNumericFound;
}

마치며

split() 는 문자열을 어떤 인자를 기준으로 배열화하는 유용한 함수입니다.
정규식은 복잡하게 느껴질 수 있지만, 원리를 파악하여 그때그때 찾아서 사용할 수 있도록 합시다.

profile
안녕하세요

0개의 댓글