P와 Y를 대소문자 상관없이 센 뒤에, 그 갯수가 맞으면 True 아니면 False를 반환하면 됩니다.
let solution = (s) => (Array.from(s.toLowerCase(s)).reduce((acc, cur) => acc += (cur === 'p' ? 1 : (cur === 'y' ? -1 : 0)), 0)) === 0;
그런데, 다른 사람들의 풀이를 보니 신박하게 푸신 분들이 많았습니다.
split
의 특성을 이용하여 글자의 수를 측정해 푸신 분
let solution = (s) => s.toLowerCase().split("p").length === s.toLowerCase().split("y").length;
이 풀이의 원리는 특정 문자 기준으로 split
메소드를 수행하게 되면 해당 글자를 기준으로 앞 뒤를 배열로 나누기 때문에, 결국 split
결과의 length
는 해당 문자열 안에 들어있는 기준 문자 ("p"
혹은 "y"
)의 갯수 +1이 됩니다.
만일 기준 문자가 하나도 안들어 있다면, 1이 나올테고, 1개가 들어있다면 2가 나오고 이런식입니다.
아무튼 핵심 아이디어는 split
으로 글자 수 측정이 가능하다는 것입니다.
그래서 이런 풀이가 가능합니다.
문자열에 관련된 문제를 해결할 때는 언제나 정규표현식도 고려해주면 좋을 것 같습니다.
let solution = (s) => (s.match(/p/ig)||[]).length === (s.match(/y/ig)||[]).length;
이렇게 하면, 정규표현식으로 풀 수 있습니다.
정규표현식에서 /
뒤에 붙는 ig
와 같은 옵션에 대해 설명하자면,
i
는 대소문자를 구분하지 않겠다는 뜻이며,
g
는 전역에서 찾겠다는 뜻이고,
m
은 여러 라인에 거쳐서 찾겠다는 뜻입니다.
또 .match()||[]
와 같은 형식으로 표현해준 이유는 단 한글자도 매칭되지 않는다면, null을 반환하기 때문입니다.
||
대신에 ??
를 적어도 됩니다.