TIL 21.07.20

김지욱·2021년 7월 25일

TIL

목록 보기
1/5

# 알고리즘

프로그래머스 - 문자열을 정수로 바꾸기

풀이

  • Number 메소드를 통해서 숫자로 변환이 가능한지 확인

    Number("a123") ⇒ NaN

  • 문자열의 길이가 4 또는 6인지 확인

처음에는 이렇게 두 가지의 경우를 생각하고 문제를 풀었다.

function solution(s) {
    const sLength = s.length;
    
    if(isNaN(Number(s))) {
      return false
    } 
    
      if(sLength === 6 || sLength === 4) {
          return  true
      } else {
          return false
      }
   }

하지만 또 하나의 테스트가 통과하지 못했다. 요즘 계속 하나씩 예외가 생기고 있는데 프로그래머스는 테스트를 확인해 볼 수 없어서 아쉽다.

작성한 solution에서 예외가 생길만한 부분은 isNaN 또는 Number 일거 같아서 두 메서드를 확인해 봤다.

MDN문서에서 특이한 점을 찾을 수 있었다.

Number('0x11')    // 17
Number('0b11')    // 3
Number('0o11')    // 9
Number("0x20")    // 32 

Number에 문자가 하나라도 들어가면 NaN이 나오기를 기대했는데 위와 같은 예외 사항이 존재했었다.

  • 0b : 2진수
  • 0o : 8진수
  • 0x : 16진수

앞에 접두어(ex: 0b) + 숫자를 입력하면 해당 진수로 변환이 되어서 이런 경우에는 기대했던 조건과 다른 결과가 나오고 있었다.

function solution(s) {
 const checkNan = s.split("").filter(n => isNaN(Number(n))); 
  if(checkNan.length !== 0) {
    return false;
  }
  
  const sLength = s.length;
  if(sLength === 4 || sLength === 6) {
    return true;
  } else {
    return false;
  }
}

NaN을 체크하는 부분을 위와 같이 수정해 주었다.

0개의 댓글