오늘은 단어수세기를 구현해보겠습니다.
보통 한국어는 글자수를 기준으로, 영어는 단어수를 기준으로 셉니다
// 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() 는 문자열을 어떤 인자를 기준으로 배열화하는 유용한 함수입니다.
정규식은 복잡하게 느껴질 수 있지만, 원리를 파악하여 그때그때 찾아서 사용할 수 있도록 합시다.