프로그래머스 - 문자열을 정수로 바꾸기
풀이
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이 나오기를 기대했는데 위와 같은 예외 사항이 존재했었다.
앞에 접두어(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을 체크하는 부분을 위와 같이 수정해 주었다.