- 파라미터 s는 문자열 (길이는 50이하, 알파벳으로만 구성)
- 문자열 s 내의 'p', 'y'의 개수를 비교
- 개수가 같으면 true, 다르면 false
- *단, 'p', 'y' 하나도 없는 경우는 true (대소문자 구별하지 않음)
어젯 밤에 하기싫은데 해야해서 억지로 풀다가 더 안풀려서 그냥 덮고 잤다.
오늘 아침에 새로운 정신으로 푸니 금방 푸네용 ...
1레벨 문제 두번째인데, 시작빨이 좋다 !
function solution(s){
const sTxt = s.toLowerCase()
const countP = [...sTxt].reduce((acc, cur) => {if(cur === 'p'){acc+=1} return acc}, 0)
const countY = [...sTxt].reduce((acc, cur) => {if(cur === 'y'){acc+=1} return acc}, 0)
return countP && countY === 0 || countP !== countY ? false : true
}
s를 먼저 toLowerCase()를 사용해 다 소문자화 시켜준다.'p'의 개수와 'y'의 개수를 세어주어야 하기에, 나는 reduce()를 사용했다.문자열 sTxt 를, spread operator 로 배열 얕은 복사를 시킨다. reduce()는 배열 메소드이기 때문에, 먼저 문자열을 배열로 만들어주는 것!reduce()를 활용하여 각 요소를 순회하게 된다.cur)가 'p'인 경우에 누산값(acc)에 1씩 더하여 할당시켜라. (참고로 누산값(acc)이 0으로 시작할 수 있게, initialValue 자리에 0을 넣어준다.)'p' 가 등장할 때마다, 갯수를 세주는 셈이 된다. 'y'도 위와 똑같이 reduce()'p'와 'y'의 개수가 각 변수 countP, countY 에 담기게 되고, return 으로 삼항연산자로 비교하여 boolean 값을 반환시키도록 했다.'p' 와 'y'가 없거나(개수가 0), 개수가 같지 않으면 false 아니면 true(개수가 같으면)!function solution(s){
return [...s.toLowerCase()].reduce((acc, cur) => {
if(cur ==='p') return acc + 1;
else if(cur ==='y') return acc - 1;
return acc;
}, 0) ? false : true;
}
똑같이 reduce()를 썼는데, 저 안에서 연산을 하다니!
toLowerCase()도 spread operator내에 사용하고,
'p'와 'y'의 개수에 따라 누산값(acc)에 + 혹은 - 를 해준다.
두개 다 0이면 0이 반환되기 때문에, true 가 될 것이고..
두개 다 같은 개수이면, 동일한 값이 더해졌다가 빼지기 때문에 0이 되어, true..
같은 개수가 아니면, 0이 아닌 다른 값이 되기 때문에 truthy 한 값이 되어 false 가 반환된다.. 👏🏻
수학적 사고 ㅜ_ㅜ !
function solution(s){
const countP = [...s.toLowerCase()].reduce((acc, cur) => {if(cur === 'p'){acc+=1} return acc}, 0)
const countY = [...s.toLowerCase()].reduce((acc, cur) => {if(cur === 'y'){acc+=1} return acc}, 0)
return countP && countY === 0 || countP !== countY ? false : true
}