Vowel Count<7 kyu>

jjanmo·2020년 1월 16일
0

Codewars에서 뒹굴기

목록 보기
20/32

문제링크

문제

Return the number (count) of vowels in the given string.

We will consider a, e, i, o, and u as vowels for this Kata.

The input string will only consist of lower case letters and/or spaces.

🚩 문제해석
주어진 문자열의 모음의 개수를 구하시오.

문제 접근

  function getCount(str) {
    var vowelsCount = 0;
    return str.split('').reduce((vowelsCount,char)=>{
      if(char === 'a' || char === 'e' || char === 'i' || char === 'o' || char === 'u') vowelsCount++;
      return vowelsCount;
    }, 0);
  }

점점 reduce() 메소드에 익숙해지는 것 같아서 뿌듯하다. 안쓰던 것들을 의도적으로 사용하다보면 뭔가 내가 성장하는 기분이 든다. 그냥 자기만족일 수도...😅 위 풀이는 문자열을 배열화(by split() 메소드)한 후에 reduce()를 통해서 배열의 요소 안에 모음을 확인해서 누적값(=총 모음의 개수)를 구한 것이다.

Best Solution

뭔가 내가 생각한 풀이보다 직관적인(?) 풀이가 있을거라는 생각을 했지만 , 그것이 정규표현식 이라고는 생각지 못했다. 아마도 그 이유는 내가 한번도 정규표현식을 사용해서 문제를 접근한 적이 없어서가 아닐까. '따로 정리를 해야지' 라는 생각만 할 뿐 실천하지 못한 나의 의지박약 문제라 자책하는 중. 그래서 문제를 풀면서 나오는 것들만이라도 챙겨가자는 생각에 이 문제에서 나온 정규표현식들에 대해서 정리해본다.

이 문제에서는 2가지 패턴의 정규표현식이 나타났다. 모음(a,e,i,o,u)인 것들을 직접 찾는 것과 모음이 아닌 것들을 제거하는 방법이다.

  • 모음을 직접 찾는 패턴
  function getCount(str) {
    return (str.match(/[aeiou]/ig)||[]).length;
  }

str.match(정규표현식) : 문자열이 정규표현식과 매치되는 부분을 검색한다. 문자열과 정규식이 일치하는 부분을 첫번째 요소로 담은 Array를 반환한다. 일치하는 값이 없으면 null을 반환한다.

const str = 'kkkesddwasdasd';
str.match(/[aeiou]/i); 
/*
output:
[ 'e', index: 3, input: 'kkkesddwasdasd', groups: undefined ]
*/

기본적으로 정규표현식과 매치되는 첫번째 문자열의 여러가지 정보를 담은 배열을 리턴한다. 단, 정규표현식의 g flag와 함께 사용되면 매치되는 모든 문자열을 담은 배열을 리턴한다.

  1. / : 패턴구분자
  2. [글자셋] : 글자셋에 포함되는 어떠한 문자와도 대응되는 것을 나타낸다. [aeiou]는 a, e, i, o, u 중 어떠한 것 이라도 대응되는 것을 찾는다.
  3. i : ignore case 를 의미하며 대상 문자열에 대해서 대/소문자를 식별하지 않는 것을 의미
  4. g : global 를 의미하며 대상 문자열내에 모든 패턴들을 검색하는 것을 의미
  • 모음을 제외한 문자를 제거하는 패턴
  function getCount(str) {
    return str.replace(/[^aeiou]/gi, '').length;
  }

str.replace(정규표현식, 바꿀문자열) : 정규표현식과 일치는 문자열을 바꿀문자열로 치환한 새로운 문자열로서 반환한다. 기존의 문자열은 바뀌지 않는다.

  1. [^글자셋] : ^는 not을 의미하며, 글자셋이 아닌 것과 대응되는 것을 찾는다. [^aeiou]는 a, e, i, o, u 가 아닌 글자와 대응되는 것을 찾는다.

결론

문제 풀이에 사용된 몇 가지의 정규표현식에 대해서 알아봤다. 이 외에서 여러가지 표현과 패턴들이 존재했다. 이러한 패턴들이 있다는 것만 알아도 나중에 정규식과 관련된 메소드를 사용할 때, 찾아보면서 사용할 수 있을 것 같다. 이러한 종류의 지식들은 있다는 것을 아는 것과 어떤 키워드로 빠르게 찾아서 사용하는 것이 중요하다. 그러기 위해서 익숙해져야만 하겠다.

참고

MDN String.prototype.match()
MDN 정규표현식
정규표현식(Regex)정리_하마블로그

🚀 문제를 풀어나갈 때 생각의 흐름을 정리합니다. 또한 새로운 풀이에 대한 코드를 분석하고 모르는 부분에 대해서 정리합니다. 생각이 다른 부분에 대한 피드백은 언제나 환영합니다. 틀린 내용에 대한 피드백 또한 항상 감사합니다.

profile
눈길을 걸어갈 때 어지럽게 걷지 말기를.

0개의 댓글