[JS] 연습문제 > 문자열 내 p와 y의 개수
대문자와 소문자가 섞여있는 문자열 s가 주어집니다.
s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요.
'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다.
단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.
예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.
function solution(s){
s = [...s.toLowerCase()];
const p = (s.filter(a => a == 'p')).length;
const y = (s.filter(a => a == 'y')).length;
return p == y;
}
내가 푼 코드
문자열에는 대소문자가 섞여있기 때문에 대문자 또는 소문자로 일치를 시켜주고 전개연산자를 이용해 한 문자씩 배열에 담아줬다
후에 filter를 이용해 인덱스의 값이 p또는 y의 값과 일치하는 것만 추출해 배열을 만들고 그것의 길이를 구해 각각 p와 y 변수에 담아줬다
return을 시킬 때 처음에는 p==y ? true : false로 적었는데 생각해보니 p==y자체가 일치하면 true고 다르면 false여서 저렇게 수정했다.
function numPY(s){
return s.toUpperCase().split("P").length === s.toUpperCase().split("Y").length;
}
다른 사람 풀이
split은 문자열을 분할하는 메소드다.
P를 기준으로 분할을 하게 되면 [ '', '', 'OOOYY' ] 가 나오게 되고,
Y를 기준으로 분할을 하게 되면 [ 'PPOOO', '', '' ]가 나온다.
이 배열의 길이는 P 또는 Y가 있는 개수의 길이보다 1씩 많게 되는데 둘다 동일하게 1씩 더해졌기 때문에 굳이 -1을 하지 않고 길이를 구하게 되면 개수가 일치하는지 아닌지 여부를 알 수 있다.
function solution(s){
return s.match(/p/ig).length == s.match(/y/ig).length;
}
다른 방법으로는 match를 통해 확인할 수도 있다.
일치하는 문자를 배열로 반환해줘서 그 길이를 확인하면 된다.
정규식에서 i를 써서 대소문자 구별없이 확인하고 g를 써서 문자열 내의 모든 글자를 확인한다.
다만 match를 쓸 때 주의할 점은 p또는 y가 하나도 없는 문자열이라면 null을 반환하기 때문에
null의 length를 구하려고 하면 오류가 발생한다.
이땐 null처리를 해줘야만 한다!