정규표현식을 연습할겸 쉽게 풀고 넘어가려고 했지만, 생각보다 런타임 에러로 고전해서 정리하려고 블로그를 작성한다.
문제: 대소문자를 구분하지 않고 문자열 s에 'p'의 개수와 'y'의 개수를 비교해서 같거나 둘다 없으면 True, 다르면 False를 return 하는 solution을 완성하시오
입출력 예
s | answer |
---|---|
"pPoooyY" | true |
"Pyy" | false |
최초 풀이(오류)
function solution(s){
// 만약 s가 'pPoooyY'이면
const findP = s.match(/p/gi);
// findP는 ['p', 'P']가 된다.
const findY = s.match(/y/gi);
// findY는 ['y', 'Y'] 이다.
return findP.length === findY.length;
}
위와같이 풀었는데 런타임 에러가 났다.
그 이유를 곰곰히 생각해 봤는데, 만약 s가 'abcd'
같이 p나 y가 둘 중에서 하나라도 없으면 null이 나온다.
그러면 findP
는 null
이 되는 것이다. null.length
는 존재할 수 없으므로 런타임 에러가 나오는 것이다.
그래서 아래와 같이 삼항 연산자를 사용해서 둘 중 하나라도 null
일 경우에 findP
와 findY
를 비교한다.
만약 p와 y 둘다 없어서 둘다 null
일 경우에도 true가 나와서 조건을 만족한다.
나의 풀이
function solution(s){
const findP = s.match(/p/gi);
const findY = s.match(/y/gi);
return findP === null || findY === null ? findP === findY : findP.length === findY.length;
}