(Lv. 1) 문자열 다루기 기본 (문제 링크)
문자열 s가 주어졌을 때, s의 길이가 4 또는 6이고, 숫자로만 구성되어있는지 return하는 solution 함수를 완성하라.
function solution(s) {
let answer = true;
if (s.length !== 4 && s.length !== 6) answer = false;
for (let i = 0; i < s.length; i++) {
if (isNaN(Number(s[i]))) answer = false;
}
return answer;
}
처음에는 단순하게 알파벳은 숫자로 변환이 되지 않는다는 생각에 아래의 코드를 사용했다.
if (isNaN(Number(s)) || (s.length !== 4 && s.length !== 6)) answer = false;
예시로 나온 입력값도 모두 문제 없이 처리가 됐다. 하지만..
딱 한 문제... 진짜 딱! 한 문제가 통과가 안된다!!!
원인을 알고 싶어서 다른 사람들이 해결한 코드를 찾아보았다.
반례가 존재했다. "10e1"
세상에.... 아니.... 아....
솔직히 "저게 왜 돼?!" 하는 생각이 들면서도 한편으로는 "하긴.. 지수니까 숫자로 인식되는게 맞긴 하지ㅠㅠ" 하는 생각이 들었다.
그래서 코드를 전체 문자열 자체를 탐색하는 것에서 각 문자를 탐색하는 것으로 수정하였다.
// AS-IS
isNaN(Number(s)) answer = false;
// TO-BE
for (let i = 0; i < s.length; i++) {
if (isNaN(Number(s[i]))) answer = false;
}
알고리즘은... 알면 알수록 쉽지 않다....