문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/12916
대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.
function solution(s) {
let pArr = s.match(/[p]/gi)
let yArr = s.match(/[y]/gi)
if(pArr === null && yArr === null) return true
else if(pArr === null || yArr === null) return false
else if(pArr.length === yArr.length) return true
else return false
}
처음에는 정규표현식이 생각나서 써 봤는데 match를 썻을 때 s에 p나 y가 없으면 null이 나와서 오히려 더 복잡해 보였다.
그래서 정규표현식을 사용하지 않는 다른 풀이를 작성해봤다.
function solution(s){
s = s.toLowerCase();
let arr = s.split('').filter((el => {
if(el === 'p' || el === 'y') {
return true;
}
}))
let pCount = 0;
let yCount = 0;
for(let str of arr) {
str === 'p' ? pCount++ : yCount++;
}
return pCount === yCount ? true : false
}
function solution(s) {
return s.toLowerCase().split('').reduce((acc, cur) => {
if(cur === 'p') acc + 1
else if(cur === 'y') acc - 1
return acc
}, 0) ? false : true
}
acc의 값을 통해서 p의 개수와 y의 개수의 관계를 나타낸다.
최종적으로 반환되는 acc가
양수면 p가 더 많다는 의미이고
0 이면 p와 y의 개수가 같다는 의미이고
음수면 y가 더 많다는 의미이다.
양수, 음수는 truthy, 0은 falsy 이기 때문에
reduce의 결과값이 양수, 음수라면 즉, p와 y의 개수가 서로 다르면 false
reduce의 결과값이 0이라면 즉, p와 y의 개수가 같다면 true 가 반환된다.