TIL

5월 23일 TIL

양죠니 2023. 5. 24. 00:20

문자열 s에 'p'의 개수와 'y'의 개수를 비교해 (대소문자 구별 안함) 같으면 True, 다르면 False를, 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴하는 코드를 작성 중에 난 오류를 적어보겠다.

 

우선 입력받은 문자열을 배열로 바꾸어 인덱스 값을 for문으로 돌면서 비교해보려고 했다.

let str_s = s.split(); //s는 입력받은 문자열
  for (let i = 0; i < s.length; i++) {
    if (str_s[i] == "P" || str_s[i] == "p") {
      p_num++;
    }
    if (str_s[i] == "Y" || str_s[i] == "y") {
      y_num++;
    }
  }

입력받은 문자열을 배열로 바꾸려고 spilt() 메소드를 사용했는데, 여기 사용법이 문제였다.

s = "ㄱㄴㄷㄱ";
let str_s = s.split();
console.log(str_s); // 출력 ["ㄱㄴㄷㄱ"]
console.log(str_s[0]); //출력 ["ㄱㄴㄷㄱ"]

split() 메서드에 파라미터로 위처럼 아무것도 주지 않는다면 문자열 전체를 길이가 1인 배열에 담아 리턴을 한다. 

인덱스 0의 값을 출력하니 역시나 통채로 출력이 되었다. 

 

그래서 스프레드 연산자를 사용해 보았는데

s = "ㄱㄴㄷㄱ";
let str_s = [...s];
console.log(str_s[0]); // ㄱ

여기선 제대로 문자열이 하나씩 배열에 차례로 잘 들어가 해결이 되었다.

 

알고보니 split() 메서드의 사용법을 잘못알고있었다. 

주어진 문자열을 어떻게 나눌것인지의 기준을 파라미터로 넘겨줘야 했었다. 하지만 나는 넘겨주지 않았으니 통채로 하나의 배열로 들어갔던 것이다. 

s = "ㄱㄴㄷㄱ";
let str_s = s.split("");
console.log(str_s[0]); // ㄱ

하나씩 나누기 위해선 빈문자열을 넣어주면 한글자씩 배열에 들어가게 된다.

 

function solution(s) {
  
  let p_num, y_num; //p와 y의 개수를 파악할 변수
  let str_s = s.split("");
 
  for (let i = 0; i < s.length; i++) {
    if (str_s[i] == "P" || str_s[i] == "p") { //배열을 돌면서 p이거나 P이면 p_num 증가
      p_num++;
    }
    if (str_s[i] == "Y" || str_s[i] == "y") { //배열을 돌면서 y이거나 Y이면 y_num 증가
      y_num++;
    }
  }
  //console.log(p_num, y_num);
  
  if (p_num == y_num) { 
    console.log("True");
  } else {
    console.log("False");
  }
}

solution("pPoooyY");

또 오류가 났다. 그래서 for 문을 돌고나서 p_num과 y_num을 출력해보니 NaN 값이 나왔다.

알고보니 내가 변수를 선언하면서 0으로 초기화해줘야 했는데 빼먹어서 값이 NaN 으로 나왔던것,,

  let p_num = 0, y_num = 0;

위 코드를 추가해주어 해결완.