The journey to becoming a developer

My future is created by what I do today, not tomorrow.

Algorithms/Programmers

[프로그래머스 Level 1] 문자열 다루기 기본 (자바스크립트)

Millie 2021. 10. 13. 11:17

Description

문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.

Constraints

s는 길이 1 이상, 길이 8 이하인 문자열입니다.

 

My Solution

function solution(s) {
  if (s.length === 4 || s.length === 6) {
    if (s.includes('e')) return false;
    return !isNaN(s);
  } else return false;
}

가장 처음의 조건으로는 문자열의 길이가 4 또는 6이어야 하고, 그렇지 않으면 false를 리턴한다.

문자열의 길이 조건을 통과했다면, 그 문자열에 'e'가 포함되어 있는지 판별하고, 만약 e가 있다면 false를 리턴한다. 

  • 처음에는 이것을 포함하지 않았었는데, 테스트 케이스 11번만 통과하지 못했다. 이유는 바로 자바스크립트에서 e는 지수로 쓰이기 때문에 "7.7e+4" 같이 e가 들어간 문자열도 숫자로 평가되기 때문. 
  • 즉 e가 있다고 해서 숫자로 판단하는 것이 아닌 문자열로 판단하기 위해 조건을 추가하였다.

e가 포함되어 있지 않다면 isNaN 함수의 결과를 ! 연산자를 이용해서 참이면 거짓으로, 거짓이면 참으로 반환한다. 

  • isNaN은 NaN이면, 즉 숫자가 아니면 true를 반환한다. 그런데 숫자일 때 true를 반환해야 하므로 !(not) 연산자를 써 준 것. 
  •  참고로 '', ' ' (empty string, 공백으로만 된 스트링)은 숫자로 0으로 변환된다. 그래서 isNaN 하면 false이다.

 

Other's Solutions

Array.prototype.every()

function solution(s) {
  const len = s.length;
  if (len === 4 || len === 6) {
    return s.split('').every(c => !isNaN(c));
  }
  return false;
}

문자열을 split('')으로 요소 하나하나를 배열로 만든 뒤, every로 그 모든 요소가 주어진 조건을 통과하면 true를, 그렇지 않으면 false를 리턴한다. 

 

Regular expressions

function solution(s) {
  var regex = /^\d{6}$|^\d{4}$/;
  return regex.test(s);
}

정규식 리터럴은 슬래시(/)로 감싸서 사용한다. 

^ : 입력의 시작 부분에 대응된다. 

$ : 입력의 끝 부분과 대응된다. 

{n} 이런 식으로 { } 안에 양의 정수를 넣어서 앞의 표현식이 n번 나타나는 부분에 대응된다. 여기서는 숫자가 6번 또는 4번 나타나는지 확인하는 용도로 쓰였다.

\d : 숫자 문자에 대응된다. [0-9]와 동일하다. 

| : or 이다. 

test() 메서드는 주어진 문자열이 정규 표현식을 만족하는지 판별하고, 그 여부를 true 또는 false로 반환한다.

즉 주어진 문자열이 길이가 4거나 6인 숫자인지를 검사하는 정규 표현식. 

 

Reference

https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Regular_Expressions

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test