대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.
예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.
문자열 s의 길이 : 50 이하의 자연수
문자열 s는 알파벳으로만 이루어져 있습니다.
s answer
"pPoooyY" true
"Pyy" false
'p'의 개수 2개, 'y'의 개수 2개로 같으므로 true를 return 합니다.
'p'의 개수 1개, 'y'의 개수 2개로 다르므로 false를 return 합니다.
function solution(s){
let answer = true;
let arr = [];
let countP = 0;
let countY = 0;
for(let i = 0; i < s.length; i++){
arr[i] = s.substr(i, 1) //substr(startIndex, length) : 시작index글자부터 length길이만큼 string을 잘라서 배열에 넣음
if(arr[i] === 'P'|| arr[i] === 'p'){
countP++; //만약 arr[i]가 p이거나 P이면 countP를 증가시킴
}else if(arr[i] === 'Y'|| arr[i] === 'y'){
countY++;//만약 arr[i]가 y이거나 Y이면 countY를 증가시킴
}
}
if(!s.includes('p'&&'P'&&'y'&&'Y')){ // string이 위 문자열들을 모두 포함하지 않으면 true 리턴
answer = true;
}
if(countP === countY){ //count가 같으면 true 리턴
answer = true;
}else if(countP !== countY ){ // 다르면 false 리턴
answer = false;
}
return answer;
}
includes함수는 대소문자를 구분한다.
includes메서드는 ECMAScript6부터 지원하기 때문에 일부 환경에서는 실행이 되지 않을 수도 있다고 한다.
그 대체로 indexOf함수가 있다.
str.indexOf(searchStr, fromIndex)
indexOf함수는 특정 문자열이 존재하면 첫번째 문자열을 반환하고, 포함하지 않으면 -1을 반환한다. 동일한 문자열이 존재하면 검색 시작 위치에서 가장 가까운 index를 반환한다.
fromIndex: 검색 시작 위치로 생략하면 0으로 인식된다.
매개변수의 값이 문자열의 길이보다 크거나 같다면, 포함여부를 탐색하지 않고 -1을 리턴한다.
indexOf함수도 대소문자를 구분한다.
function solution(s){
return s.toUpperCase().split("P").length === s.toUpperCase().split("Y").length;
}
split("매개변수")는 string을 매개변수를 기준으로 나눠서 각 앞 뒤 문자열을 배열에 넣는다.
let s = "PPYPyp"
let a = s.toUpperCase().split("P")
console.log(a)
//[ '', '', 'YY', 'Y', '' ]
이에 split("P").length를 이용하면 포함된 P의 개수를 알아낼 수 있다.
또한 일일이 'p', 'P', 'y', 'Y'를 대소문자를 구분해서 따로따로 예시를 드는 것이 아니라 어차피 문제에서는 대소문자를 구별하지 않는다고 하였기 때문에 처음부터 string을 toUpperClass로 대문자로 만들어 주거나 toLowerClass로 소문자로 전체를 다 바꿔서 upperclass만 확인하거나 lowerclass만 확인하면 간단히 해결할 수 있다.