Coding test
[프로그래머스] 문자열 내 p와 y의 개수 (Level 1)
Jiwoo
2022. 4. 5. 20:56
문제
대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.
예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.
- 제한사항
- 문자열 s의 길이 : 50 이하의 자연수
- 문자열 s는 알파벳으로만 이루어져 있습니다.
나의 풀이
function solution(s){
// s를 소문자로 변경하고 배열 만들기
let arr = s.toLowerCase().split("");
// 개수 계산 : array.reduce로 요소 발견 시마다 sum += 1
let p = arr.reduce((sum,value) => value == "p" ? sum + 1: sum, 0);
let y = arr.reduce((sum,value) => value == "y" ? sum + 1: sum, 0);
// if p의 개수 = y의 개수 => return true
if(p == y) {
return true;
}
// else if => return false
return false;
// p,y의 개수 = 0 일 때, 에러 발생하면 맨 위에 경우의 수 추가
}
array.reduce
를 이용해 개수를 세고 boolean을 반환했다.
삼항 연산자로 코드를 줄여보려 했지만 더 복잡해질 것 같아서 여기서 손을 뗐다.
- 정확성 테스트 결과
다른 풀이
split을 사용한 창의적 풀이
function numPY(s){ //함수를 완성하세요 return s.toUpperCase().split("P").length === s.toUpperCase().split("Y").length; }
"p"나 "y"를 separator로 지정해서 끊어 만든 배열의 length로 갯수를 셌다.
다시 말해,s.toUpperCase().split("P").length
= p의 갯수 + 1이런 창의적인 방법으로 문제를 해결할 수도 있다니 감탄스럽다.
- 정확성 테스트 결과
속도 역시 훨씬 빠르다
대문자, 소문자로 변환 x
function solution(s) { const p = s.split('').filter(v => ['p', 'P'].includes(v)); const y = s.split('').filter(v => ['y', 'Y'].includes(v)); return p.length === y.length; }
toUpperCase
나toLowerCase
를 사용하지 않는 방식이다.
역시 창의적이고 깔끔하다.
정규표현식
match
사용
function solution(s) { return s.match(/p/gi).length === s.match(/y/gi).length; }
위 식은 p와 y가 없을 때 에러가 나기 때문에 예외처리가 필요해서
완벽한 정답은 아니다.
정규표현식
replace
사용
function solution(s){ return s.replace(/p/gi, '').length == s.replace(/y/gi, '').length; }
이런 식으로replace
를 사용할 수도 있다.
아직 배울 것이 많고 길을 멀다!!!