- 파라미터 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
}