[풀이1]
function solution(s) {
const lowerCaseStr = s.toLowerCase();
const pCount = lowerCaseStr.split('p').length - 1;
const yCount = lowerCaseStr.split('y').length - 1;
return pCount === yCount;
}
toLowerCase 는 문자열을 소문자로 변환하는 메서드. 문자를 소문자로 전부 바꾸어 계산한다.
split() 메서드는 문자열을 지정한 구분자를 기준으로 나누고, 나눠진 결과를 배열로 반환한다. 예를 들어
const str = "apple";
const result = str.split('p');
console.log(result); // ["a", "", "le"]
p 를 기준으로 나누었으므로, 첫 번째 p 의 앞부분 a , 두 p 사이의 공백인 "" , 그리고 두 번째 p 이후의 부분인 le 로 나뉘어 ["a", "", "le"] 가 반환된다.
toLowerCase 로 소문자화한 문자열을 p 로 나눠준다. lowerCaseStr.split('p') 로 문자열을 모든 p 기준으로 나눈다. 만일 ppyyoo를 나누면, 문자열의 첫 p 앞에 아무 것도 없으므로 빈 문자열인 "" , 두 번째 p 와 첫 번째 p 사이도 "" , 그리고 마지막 p 이후의 나머지 문자열인 yyoo 로 나뉘어 ["", "", "yyoo"] 의 배열이 반환된다.
split('p') 로 나눠진 배열의 길이는, 문자열에 등장한 p 의 개수보다 1만큼 더 많다. 따라서 split('p').length - 1 을 해주어야 p 의 개수를 얻을 수 있다.
∴ 주어진 문자열에서 p 나 y 의 개수를 구할 수 있는 코드는 아래와 같다.
cosnt pCount = lowerCaseStr.slpit('p').length - 1;
// p 의 개수 구하기
const yCount = lowerCaseStr.split('y').length - 1;
// y 의 개수 구하기
이렇게 정확한 알파벳의 개수를 구해서 비교하면 끝!
생각해보면 -1 을 하나 안하나 어차피 개수 비교는 같은 숫자가 뜬다. 그리고 꼭 스트링을 따로 변환한 후에 비교하지 않아도 될 것 같은데 그러면 더 간단하게 코드를 짤 수 있다!
function solution(s) {
return s.toLowerCase().split('p').length === s.toLowerCase().split('y').length
}
이렇게 짜면 한 줄로 코드 완성!