대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.
예를 들어 s가 pPoooyY면 true를 return하고 Pyy라면 false를 return합니다.
function solution(s){
var answer = true;
let pCount = 0;
let yCount = 0;
const sArr = s.toLowerCase().split('');
for(let s of sArr) {
if(s === 'p') {
pCount++
}else if(s === 'y'){
yCount++
}
}
if(pCount === 0 && yCount === 0) {
return true;
}else if(pCount === yCount) {
return true
}else {
return false
}
}
또 생각한 그대로 작성해나갔다.
통과는 되었는데 생각해보니 filter를 쓸 수 있지 않을까 해서 수정해보았다.
function solution(s) {
const lowerArr = s.toLowerCase().split('');
const pArr = lowerArr.filter(p => p === 'p');
const yArr = lowerArr.filter(y => y === 'y');
return pArr.length === yArr.length ? true : false;
}
코드 길이가 절반은 줄었고 한 번에 알아보기도 쉬워졌다.
하지만 filter를 중복으로 쓰고 있다는 느낌이라 좀 아쉬운 느낌이다.
function numPY(s) {
return s.match(/p/ig).length == s.match(/y/ig).length;
}
이 풀이를 보면서 match
에 대해 알게되었다.
하지만 이 경우에는 'p'와 'y'가 없을 경우의 예외처리가 되지 않는 다는 댓글을 보았다. 생각해보니 p와 y가 없다면 배열이 만들어지지 않아져 null값이 나올 것이고 length를 구할 수 없다.
나는 if문을 이용해서 수정했지만 놀랍게도 아주 간단하게 예외처리를 한 풀이가 있어서 안 가져 올 수가 없었다.
function solution(s) {
return match = s.match(/p/ig)?.length === s.match(/y/ig)?.length;
}
?
를 추가해 예외처리를 끝냈다. 오...
null === null
라는 점을 이용한 풀이인데 전혀 생각도 못 했다.
역시 꾸준히 써보고 생각하는 연습이 필요한 것같다.