프로그래머스 알고리즘 문제풀이 lvl.1 - 문자열 내 p 와 y 의 개수

Jung Hyun Kim·2021년 1월 7일
0
post-thumbnail

1주 1알고리즘 문제 풀기 시자악👆

문제

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

예를 들어 s가 pPoooyY면 true를 return하고 Pyy라면 false를 return합니다.


나의 풀이

  1. 먼저 s string 을 split 메서드를 통해 알파벳 별로 나뉘어진 배열을 만든다.
  2. 그 배열에서 각각 필터를 돌려서 p만 담는 배열, y 만 담는 배열을 만든다.
  3. p, y 모두 하나도 없다면 true를 리턴할 수 있도록 includes 메서드로 분기 시킨다.
  4. 두 배열의 length 를 비교하여 true/false로 분기 시켰다.
function solution(s){
  
  let answer = true; 
  
  // 1. 먼저 s string 을 `split` 메서드를 통해 알파벳 별로 나뉘어진 배열을 만든다.
  const sArray = s.split('');
  
  // 2. 그 배열에서 각각 필터를 돌려서 `p만 담는 배열`, `y 만 담는 배열`을 만든다.
  const pFilter = sArray.filter((chr) => (chr === 'p') || (chr === 'P'));
  const yFilter = sArray.filter((chr) =>(chr === 'y') || (chr === 'Y'));

 // 3. p, y 모두 하나도 없다면 `true`를 리턴할 수 있도록 `includes` 메서드로 분기 시킨다. 
  if ((!s.includes('p' || 'P')) && (!s.includes('y' || 'Y'))) {
    answer = true;
  } 
  
  // 4.  두 배열의 `length` 를 비교하여 `true/false`로 분기 시켰다. 
    else if (pFilter.length === yFilter.length) {
    answer = true;
      
  } else if (pFilter.length !== yFilter.length) {
    answer = false;
  }
  
    return answer;
 }

좋은 다른 예시 및 풀이법

프로그래머스에서 좋아요를 많이 받은 두 정답으로 비교하기

  1. 두번째로 많은 좋아요를 받은 match 메서드를 사용하는 답안

  • string.match(/찾고자하는 char (혹은 range로 표현) /ig(대소문자 포함 g만쓰면 찾고자하는char에 맞추어 대문자면 대문자, 소문자면 소문자를 찾음), gi라고 써도 동일하게 작동)) 하면 배열을 리턴한다.

    • /[A-Z]/g : A부터 Z까지 대문자만 찾기
    • /[a-z]/g : A부터 Z까지 소문자만 찾기
    • /[a-z]/ig or /[A-Z]/ig or /[A-Z]/gi or /[a-z]/gi : A부터 Z까지 소문자/대문자 다 찾기
  function numPY(s) {
   // 즉 소,대문자를 포함한 p 배열의 길이와 y배열의 길이가 같으면 true 아니면 false를 return 하는 깔끔한 함수가 완성된다.
  return s.match(/p/ig).length == s.match(/y/ig).length;
}

  1. 첫번째로 많은 좋아요를 받은 split 메서드를 사용하는 답안

  • 먼저 string의 case를 다 uppercase로 만들고 split method를 써서 P or Y기준으로 나눈다

-P를 기준, Y를 기준으로 나뉜 배열의 길이가 똑같은 것이 즉 동일 한 수 의 P와 Y를 가지고 있는 것이므로 위의 예시와 동일하게 true아니면 false를 리턴하게 된다.


function numPY(s){
    return s.toUpperCase().split("P").length === s.toUpperCase().split("Y").length;
}

느낀 점

  • 레벨1부터 시작해서 코딩해 나가는거에는 문제가 없었지만 확실히 아는 것만 사용하다 보니 좋은 예시처럼 간결하게 작성하는데 무리가 있었다. 계속 좋은 예시를 배워나가면서 안쓰던 메서드도 쓰고 해보자! 화이팅 🙌🙌
profile
코린이 프론트엔드 개발자💻💛🤙🏼

0개의 댓글