[Programmers #12916] - 문자열 내 p와 y의 개수

G_NooN·2023년 12월 31일
0

Algorithms

목록 보기
1/33
post-thumbnail

(Lv. 1) 문자열 내 p와 y의 개수 (문제 링크)

문제 설명

대문자와 소문자가 섞여있는 문자열 s가 주어졌을 때,
s 안의 'p'의 개수와 'y'의 개수를 비교하여 같으면 true, 다르면 false를 return하는 solution을 완성하라.

예를 들어, s가 'pPoooyY'면 true를 return하고, 'Pyy"면 false를 return한다.

제한 조건

  1. s의 길이는 50 이하의 자연수다.
  2. s는 알파벳으로만 이루어져 있다.
  3. 'p'와 'y'가 모두 하나도 없는 경우에는 항상 true를 반환한다.
  4. 개수를 비교할 때 대문자와 소문자는 구별하지 않는다.

입출력 예시


해결 방법

  1. p와 y의 개수를 count할 변수를 선언한다.
  2. 대/소문자를 통일한다.
  3. 전체 문자를 순회하며 p를 count하면 변수에 1을 더하고, y를 count하면 변수에서 1을 뺀다.
  4. 최종 count 결과가 0이면 p의 개수 = y의 개수 이기 때문에,
    최종 결과가 0이면 true, 아니면 false를 반환한다.
  5. 결과를 출력한다.

코드

function solution(s) {
  // p와 y를 count할 변수를 선언
  let pyCount = 0;
  
  // s의 모든 문자를 대문자로 변경
  s = s.toUpperCase();
  
  // 전체 문자열을 순회
  for (let i=0; i<s.length; i++) {
    if (s[i] === 'P') pyCount++;	// p 발견 시 변수+1
    if (s[i] === 'Y') pyCount--;	// y 발견 시 변수-1
  }
  
  // 최종 결과가 0이면 true, 아니면 false를 반환
  let answer = pyCount === 0 ? true : false;
  
  // 결과 출력
  return answer;
}

시행착오

초기 코드

function solution(s) {
  let pCount = 0;	// p의 개수를 세는 변수
  let yCount = 0;	// y의 개수를 세는 변수
  
  for (let i=0; i<s.length; i++) {
    if (s[i] === 'p' || s[i] === 'P') pCount++;	// p, P 발견 시 pCount+1
    if (s[i] === 'y' || s[i] === 'Y') yCount++;	// y, Y 발견 시 yCount+1 
  }
  
  // pCount의 값과 yCount의 값을 비교하여 같으면 true, 다르면 false 반환
  let answer = pCount === yCount ? true : false;
  
  // 결과 출력
  return answer;
}
  • p와 y를 count하는 변수를 각각 선언하여, 각 문자에 해당하는 변수를 만났을 때 count하도록 했었다.

개선 과정

  • 대/소문자 통합
    - 대/소문자를 구별하지 않고 count하기 때문에, 소문자를 String.toUpperCase()를 사용하여 대문자로 통일시킬 수 있다.
    - 그 결과, 소문자인 경우와 대문자인 경우를 모두 고려했던 코드가 간결해졌다.
// AS-IS
if (s[i] === "p" || s[i] === "P") pCount++;

// TO-BE
s.toUppercase();
if (s[i] === "P") pCount++;
  • pCount & yCount 통합
    - 각각의 변수를 count하지 않고 p를 count했을 땐 +1, y를 count했을 땐 -1 하도록 통합하여 코드가 간결해졌다.
    - 따라서, pCount와 yCount의 값을 비교하는 것이 아닌, 두 문자의 카운트 결과가 0인지 여부를 확인하는 것으로 수정되었다.
// AS-IS
if (s[i] === "P") pCount++;
if (s[i] === "Y") yCount++;

let answer = pCount === yCount ? true : false;

// TO-BE
if (s[i] === "P") pyCount++;
if (s[i] === "Y") pyCount--;

let answer = pyCount === 0 ? true : false;

주요 개념

  1. 문자열(String)의 대/소문자 변경 메서드 : .toUpperCase(), .toLowerCase()
  2. 변수를 어떻게 정할지 생각해보자.
profile
쥐눈(Jin Hoon)

0개의 댓글