ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #AIL_23.10.14 // Programmers_문자열 내 p와 y의 개수
    AIL( Algorithm I Learned) 2023. 10. 14. 22:58

    ## AIL_문자열 내 p와 y의 개수 

     

    문제 설명
    대문자와 소문자가 섞여있는 문자열 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

    입출력 예 설명
    입출력 예 #1_'p'의 개수 2개, 'y'의 개수 2개로 같으므로 true를 return 합니다.
    입출력 예 #2_'p'의 개수 1개, 'y'의 개수 2개로 다르므로 false를 return 합니다.

    ## solution.JavaScript

     

    1. 문제의 접근 방식_문자열 's'를 대문자로 변환 후 하나씩 순회하면서 'P'와 'Y'의 개수를 파악 

     

    1) 문자열 's'를 대문자로 변환하여 대소문자를 구분하지 않도록 만들기

     

    - 이렇게 하면 'P'와  'Y'를 찾을 때 대소문자의 차이를 고려하지 않고 비교가능

    - 이 후 문자열을 처음부터 끝까지 순회하면서 각 문자를 확인

     

    2) 문자열을 순회하면서 'P'가 나타나면 'num' 변수를 증가시키고, 'Y'가 나타나면 'num' 변수를 감소시키기  

     

    - 각 문자가 'P'인 경우, 'num' 변수를 1 증가시키고 'P'의 개수도 증가

    - 각 문자가 'Y'인 경우, 'num' 변수를 1 감소시키고  'Y'의 개수도 감소 

    - 모든 문자를 확인한 후, 'num' 변수에는 'P'의 개수에서 'Y'의 개수를 뺀 값이 저장

     

    3) 마지막으로 'P'와 'Y'의 개수가 같으면 'num' 값은 0이 되므로 'result' 변수에 'true' 할당, 그렇지 않으면 'result'에 'false'가 할당되게 설정하기 

     

    - 마지막으로 'result' 변수에는 'num' 값이 0인지 여부가 저장

    - 만약 'P'와 'Y'의 개수가 동일하면 'num' 값은 0이 되며, 'result'는 'true'가 됨

    - but 그렇지 않다면 'result'는 ' false'로 나타냄


    2. 문제풀이

    function solution(s){
      var result = true;
      s = s.toUpperCase();
      var num = 0;
      for(var i = 0; i < s.length; i++){
        if(s[i] === 'P') num++; // p이면 갯수 더하기
        if(s[i] === 'Y') num--; // y이면 갯수 빼기
      } 
      result = (num === 0); // p, y 갯수가 같으면 0 (p가 많으면 양수, 반대 음수)
    
      return result;
    }

    3. 다른사람의 문제풀이 및 접근방식 분석_ES6 화살표 함수와 객체를 사용하여 'P','Y'의 개수를 세고 비교하고 문자열을 소문자로 변환하여 대소문자 구분을 처리

    const solution = s => {
      const counts = { p: 0, y: 0 };
      s.toLowerCase().split('').forEach(char => {
        if (char === 'p') counts.p++;
        if (char === 'y') counts.y++;
      });
      return counts.p === counts.y;
    };

     

    1) 입력 문자열 's'를 모두 소문자로 변환 

    2) 문자열을 문자 단위로 쪼개어 배열로 만듬 

    3) 배열의 각 문자를 반복하여 'p'와 'y'의 개수를 세고, 이를 객체에 저장

    4) 마지막으로 'p'와 'y'의 개수를 비교하여 두 값이 같은지 확인 

    5) 개수가 같으면 'true'를 반환하고, 다르면 'false'를 반환

     


    4. 두 방식의 장단점

     

    1) 첫 번째_'P'와 'Y' 문자를 카운트 하는 방식

     

    장점_//

    • 간단하고 직관적인 코드로 이해하기 쉬움 
    • 대소문자 구분을 고려하지 않아도 됨 성능 면에서 효율적이며 문자열을 한 번만 순회하므로 시간 복잡도가 낮음 

     

    단점_//

    • 다른 문자를 무시하며, 'P'와 'Y' 이외의 문자는 처리하지 않음 
    • 다른 방법보다 코드가 길어질 수 있음 

     

     

    2) 두 번째 _ES6 화살표 함수를 이용하여 소문자 변환 후 두 개수를 세어 같은지 비교하는 방식 

    장점_//

    • ES6 문법과 객체를 사용하여 코드를 간결하게 작성함으로써 가독성과 유지 보수성을 높일 수 있음 
    • 문자열을 소문자로 변환하여 대소분자 구분을 해결함 다른 문자를 무시하지 않음('P'와 'Y'이외에 문자도 세고 무시하지 않으므로 더 일반적으로 활용가능)

     

    단점_//

    • 코드가 약간 복잡하게 보일 수 있으며, ES6 문법에 익숙하지 않은 경우 해석이 어려움 
    • 성능 면에서는 첫 번째 방법보다 다소 느릴 수 있으며, 긴 문자열에서는 성능 저하의 가능성이 있음 

    결론: 성능면에서는 첫 번째 방법이 효율적이나 가독성, 유지 보수성, 대소문자 처리 등을 고려하면 두 번째 방법인 ES6 화살표 함수를 이용하는 것이 합리적인 선택이라 판단됨 

     

     

Designed by Tistory.