Algorithm JS | 프로그래머스 코딩테스트_문자열 내 p와 y의 개수

앙두·2023년 6월 17일
0

Algorithm

목록 보기
14/17

📑 문제

문제
  • 파라미터 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
}
  1. 대소문자를 구별하지 않는다는 조건 하에, 파라미터로 받는 s를 먼저 toLowerCase()를 사용해 다 소문자화 시켜준다.
  2. 'p'의 개수와 'y'의 개수를 세어주어야 하기에, 나는 reduce()를 사용했다.
  3. 소문자화 시킨 문자열 sTxt 를, spread operator 로 배열 얕은 복사를 시킨다. reduce()는 배열 메소드이기 때문에, 먼저 문자열을 배열로 만들어주는 것!
  4. 문자열 한글자 한글자가 배열요소로 펼쳐지게 되고, reduce()를 활용하여 각 요소를 순회하게 된다.
  5. 현재요소(cur)가 'p'인 경우에 누산값(acc)에 1씩 더하여 할당시켜라. (참고로 누산값(acc)이 0으로 시작할 수 있게, initialValue 자리에 0을 넣어준다.)
  6. 그러면 'p' 가 등장할 때마다, 갯수를 세주는 셈이 된다.
  7. 'y'도 위와 똑같이 reduce()
  8. 'p''y'의 개수가 각 변수 countP, countY 에 담기게 되고, return 으로 삼항연산자로 비교하여 boolean 값을 반환시키도록 했다.
  9. '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
}
profile
쓸모있는 기술자

0개의 댓글