문자열 s
의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution
을 완성하세요. 예를 들어 s가 "a234"
이면 False
를 리턴하고 "1234"
라면 True
를 리턴하면 됩니다.
s
는 길이 1 이상, 길이 8 이하인 문자열입니다.s | return |
---|---|
"a234" | false |
"1234" | true |
처음 제출했던 풀이
function solution(s) {
return s.length === 4 || s.length === 6 ? (isNaN(s) ? false : true ) : false
}
처음에는 숫자가 아닌 것(Not-a-Number
)을 판별하는 isNaN()
을 사용했다. 비슷한 것으로 Number.isNaN()
도 있는데, 이것은 단순히 숫자가 아닌 것에 true
를 반환하는 것이 아닌 계산할 수 없거나, 숫자로 읽어들일 수 없는(ex - parseInt('apple')
) 경우에 반환되는 NaN
만을 판별하는 함수이므로 이번에는 사용하기 적절하지 않았다. 그런데 제출을 하고 보니 계속 한 개 케이스에서 알 수 없는 실패가 떴다.
다시 제출한 풀이
function solution(s) {
return s.length === 4 || s.length === 6 ? (s == parseInt(s) ? true : false ) : false
}
아무리 생각해도 무엇이 문제인지 알 수 없어 다른 분들이 푼 방법을 확인했는데, '문제에서 숫자로만 구성되어 있는' 이라는 말이 정수로만 구성되어 있는지를 뜻하는 것이었다. 조금만 친절하게 적어주지... 그래서 정수가 아닌 그 외의 다른 수들에서도 false
를 반환하는 isNaN()
으로는 실패가 나온 것이다.
삼항연산자 안에 삼항연산자를 넣는 방식으로 풀었다. 먼저 s
의 길이가 4 또는 6이 맞는지 확인하고 맞다면 s
와 parseInt(s)
의 값이 같은지 비교해준다. 숫자로만 이루어진 문자열이 아니라면 결과물이 같지 않다는 것이 이용해 true
와 false
중 하나를 return한다. (이때 s
는 문자열이므로 ===
가 아닌 ==
를 사용해야 한다.