코딩테스트 #11 P와 Y의 개수

jakeseo_me·2020년 6월 25일
0

코딩테스트

목록 보기
11/23

문제

풀이

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을 반환하기 때문입니다.

|| 대신에 ??를 적어도 됩니다.

profile
대전에 있는 (주) 아이와즈에서 풀스택 웹개발자로 일하고 있는 서진규입니다. 주로 Jake Seo라는 닉네임을 많이 씁니다. Javascript를 좋아합니다.

0개의 댓글