본문 바로가기
프론트엔드로 가는 길/프로그래머스

57. 문자열 다루기 기본

by woody-j 2023. 9. 12.

https://school.programmers.co.kr/learn/courses/30/lessons/12918?itm_content=course14743#
[ 문제 설명 ]

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명
문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요.
예를 들어 s가 "a234"이면 False를 리턴하고
"1234"라면 True를 리턴하면 됩니다.
제한 사항
s는 길이 1 이상, 길이 8 이하인 문자열입니다.s는 영문 알파벳 대소문자 또는 0부터 9까지 숫자로 이루어져 있습니다.

[ 문제 풀이 ]

 

첫번째 풀이 과정

function solution(s) {
       if(s.length != 4 || s.length != 6) {
        return false
        }
      let division = s.split("");
      let a = division.map((item) => Number(item));
      for (let i = 0; i < s.length; i++) {
        console.log(Number.isInteger(a[i]));
        return Number.isInteger(a[i]);
      }
    }
  }

이렇게 했더니

"1234"가 왜 false가 나왔다 왜?

s.length != 4 || s.length != 6를 사용하면 항상 참(true)으로 평가된다.

이는 s.length가 4와 같지 않으면 6과 다르기 때문입니다. 이러한 경우 항상 return false 문이 실행되므로 입력된 문자열이 어떤 경우에도 "false"로 반환됩니다.

"나는 멍청이다"

function solution(s) {
    if (s.length === 4 || s.length === 6) {
      let division = s.split("");
      let a = division.map((item) => Number(item));
      for (let i = 0; i < s.length; i++) {
        return Number.isInteger(a[i]);
      }
    }
    return false;
  }

 

"1234ab"가 false가 아닌 true가 나오지?

 

입력 문자열의 길이가 4 또는 6인 경우, 첫 번째 숫자가 정수인 경우에만 true를 반환하고, 나머지 문자는 무시한다.

이는 return 문이 for 루프 안에서 첫 번째 숫자를 검사하고 결과를 반환하고 루프를 종료하기 때문

"어쩐지, 나는 멍청이다22"

 

정답)

function solution(s) {
    if (s.length === 4 || s.length === 6) {
      let division = s.split("");
      let a = division.map((item) => Number(item));
      for (let i = 0; i < s.length; i++) {
        if(!Number.isInteger(a[i])){
            return false
        }
      }
     return true;
      }
    return false;
  }​

 

정규식 사용해서 더 간결하게

function solution(s) {
  return /^[0-9]{4}$|^[0-9]{6}$/.test(s);
}​

정규식 없이 더 간결하게

function solution(s) {
  if (s.length === 4 || s.length === 6) {
    for (let i = 0; i < s.length; i++) {
      if (s[i] < '0' || s[i] > '9') {
        return false;
      }
    }
    return true;
  }
  return false;
}

'0'가 문자열이 아니라 숫자인가요?

ㅇㅇ, '12'는 문자열, '1','2'는 숫자

 

Number.isInterger 메소드

<script>
    Number.isInteger(0);        // true
    Number.isInteger(-100);     // true
    Number.isInteger(0.1);      // false
    Number.isInteger("문자열"); // false
    Number.isInteger(Infinity); // false
    Number.isInteger(true);     // false
</script>