티스토리 뷰

문제 설명

대문자와 소문자가 섞여있는 문자열 s가 주어집니다.

s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요.

'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다.

단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.

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

 

제한 사항..

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

입출력 예시

s answer
"pPoooyY" true
"Pyy" false

 

 

나의 코드

function solution(s){ 
    let str = `${s}`;
    let result = str.replace(/[^pPyY]/g,'');
    let pcount = 0;
    let ycount = 0;
     result = result.split('');
    for(let i = 0; i < result.length; i++){
        if(result[i] == 'p'||result[i] =='P'){
            pcount++;
        }else if(result[i] == 'y'||result[i] =='Y'){
            ycount++;
        }
    }
    if(pcount == ycount || pcount === ycount === 0){
        return true;
    }else{
        return false
    }
}

나의 풀이

1. 'p'의 개수와 'y'의 개수를 비교해야 하므로 PpYy가 아닌것들을 없앱니다.

    let str = `${s}`;
    let result = str.replace(/[^pPyY]/g,'');
    let pcount = 0;
    let ycount = 0;
     result = result.split('');

  변수에 매개변수로 받아온 문자열을 저장한뒤 저장한 문자열을 정규화로 pPyY를 제외한 모든 문자를 ''로 자릅니다.

  그런뒤 문자열을 배열형태로 만들기 위해 ''로 잘라주고 p와 y를 샐수있는 변수도 초기화 해두었습니다. 

 

2. 자르고 나면 남아있는 pP와 yY가 있는지 찾아보고 있으면 해당하는 변수에 +해주어 갯수를 확인합니다.

    for (let i = 0; i < result.length; i++) {
        if (result[i] == 'p' || result[i] == 'P') {
            pcount++;
        } else if (result[i] == 'y' || result[i] == 'Y') {
            ycount++;
        }
    }

  result(pP와 yY가 배열 형태로 들어있음)의 길이-1만큼  0번째 인덱스부터 배열길이-1만큼 반복하면서

  해당 배열의 위치에 해당 문자가 있으면 count+1을 해줍니다.

  

 

3. +해준 변수들을 가져와서 서로 비교한뒤 갯수가 같거나 또는 없으면 true를 반환 하고 아니면 false를 반환합니다.

    if (pcount == ycount || pcount === ycount === 0) {
        return true;
    } else {
        return false
    }

 

 

 

 



 

배워야 할 점

 

다른 풀이

function numPY(s){
    //함수를 완성하세요
    console.log(s.toUpperCase().split("P"));
    console.log(s.toUpperCase().split("P").length);
    console.log(s.toUpperCase().split("Y"));
    console.log(s.toUpperCase().split("Y").length);
      return s.toUpperCase().split("P").length === s.toUpperCase().split("Y").length;
  }

  // 아래는 테스트로 출력해 보기 위한 코드입니다.
  console.log( numPY("pPoooyY") )
  console.log( numPY("Pyy") )

 

• toUpperCase()

  - 모든 문자열을 대문자로 만들어주는 메서드입니다.

  - 이렇게 되면 pPoooyY가 PPOOOYY가 될수 있습니다.

• split()

  - 특정 문자열을 특정 구분자(delimiter)를 기준으로 나누어 배열로 반환하는 메서드 입니다.

  - split('P')라면 P를 기준으로 자른다음 P가 있던곳은 공백이 되고 남은 문자들은 하나로 묶이게 됩니다.

 

위 메소드들을 진행한뒤 총 배열의 길이를 새보면 P가 있던자리들은 공백이 되고 남은 문자가 하나의 문자열이 되어

pPoooyY라면 3이라는 길이가 됩니다.

마찬가지로 Y도 똑같이 적용해준뒤 서로 비교를 해보면 요구하는 값이 return될 것입니다.

 

 



 


 

 

느낀점

위 콘솔은 한눈에 봐서는 이해가 잘 안되서 제가 일일이 다 찍어본것입니다.

스스로의 부족함이기도 하면서 더 공부하고 배워야할 원동력이 된 부분입니다. 

19줄이 넘는 코드를 1줄로 줄일 수 있다는건 그만큼 제 지식이 얕다라는 말이 됩니다.

일단 문제를 봐도 대문자와 소문자가 섞여있지만 대문자와 소문자는 구별하지 않는다고 했지만 저는 그부분을 놓치고

해당하는 문자를 모두 구했습니다.

만약 이 4글자가 아니라 15개의 문자를 비교하는 것이였다면? 엄청난 하드코딩이 됐을 것입니다.

필요없는 변수선언과 소드가 너무 많은걸 스스로 느꼈지만

문제를 풀기전 한글로 먼저 어떻게 해야할지 정리한다음 정리한대로 문제를 푸니 문제가 풀렸습니다.

문제 푸는 방식은 앞으로도 계속 이어나가면서 문제를 잘 읽고 이 문제를 어떻게 더 풀어 나가야할지

고민하면서 알고리즘에 임해야겠습니다.

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함