Algorithm

Algorithm :: 프로그래머스 문제풀기 -19

hooti 2021. 3. 2. 10:59

[JS] 문자열 내 p와 y의 개수

대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다. 예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.

 

 

제한사항 :

  • 문자열 s의 길이 : 50 이하의 자연수
  • 문자열 s는 알파벳으로만 이루어져 있습니다.

 

 

 


예전에 위코드에서 풀다가 실패한 뒤, 풀지 않았던 문제인데 다시보니 불필요한 코드들이 잔뜩 있어서 고쳐봤다. 그때 왜 실패했는지 알것같은 느낌이 든다... 역시 위코드때처럼 시간을 정해놓고 풀지못하면 넘기고 다음에 다시 시도하는게 나에게 맞는 방법인듯 하다. 기존풀이는 reduce를 이용해서 풀려고했는데 새로운 풀이방법을 해본다는 생각에 갇혀서 오히려 복잡하게 풀어버렸다. 아니 풀지도 못했다. p에서 계속 오류가 났기 때문이다😂

// 기존풀이

function solution(s){
    var answer = true;
    const arr = s.split('');
    const arrr = s.split('');
    
     let y = arr.reduce((acc, cur) => {
      if(!(cur == 'y' || cur == 'Y')){
        acc = 0;
      }else if(cur == 'y' || cur == 'Y'){
        acc++;
      }
      return acc;
    });
    
    let p = arrr.reduce((acc, cur) => {
      if(!(cur == 'p' || cur == 'P')){
        acc = 0;
      }else if(cur == 'p' || cur == 'P'){
        acc++;
      }
      return acc;
    });
    
    if(y == p){
      return answer = true;
    }else{
      return answer = false;
    }
}

오늘 다시 문제를 보고 새로 푼 풀이다. 그냥 for로 하나씩 돌면서 갯수를 쌓았으면 된 문제인데 왜 저렇게 고생했을까...? 거기다가 들어오는 값을 전부 대문자로 변경해주면 더 간단해진다. 나름 짧고 간결해져서 만족스럽다! 아래 리턴값은 원래는 if문으로 썼다가 삼항연산자를 쓰자! 라는 예전 블로그글을 보고 급하게 바꿨다.

function solution(s){
    let totalP = 0;
    let totalY = 0;
  
    for(let i = 0; i <s.length; i++){
      if(s[i].toUpperCase() === 'P'){
        totalP++;
      }
      
      if(s[i].toUpperCase() === 'Y'){
        totalY++;
      }
    }
  return (totalP === totalY) ? true : false;
}

 

 

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges