오늘은 아직 내가 모르는게 많다는 것을 깨달은 문제를 설명해보겠습니다.
문제 설명
문자열 s에 길이가 4 또는 6인 문자열이 들어옵니다.
이 문자열이 숫자로만 구성되어 있는지를 검출하는 함수를 만드는 것입니다.
문제만 읽어보면 정말 간단합니다.
그래서 저는 아래와 같이 코드를 작성했습니다.
function solution(s) {
const len = s.length;
return (len === 4 || len === 6)
&& !isNaN(Number(s)) ? true : false;
}
결과는 실패...
저는 고민했습니다. 왜? 음...
그렇게 한 10분을 모든 경우의 수를 다 계산한 듯 다시 질문했습니다.
왜?? 난 맞은거 같은데 넌 왜 틀렸다하니
그리곤 아래와 같은 함수를 다시 만들죠
function solution(s) {
const len = s.length;
return (len === 4 || len === 6) && canNumber(s) ? true : false;
}
function canNumber(s) {
let res = true;
s.split("").forEach((a) => {
if (!("0" <= a && a <= "9")) {
res = false;
}
})
return res;
}
저는 제 코드에서 !isNaN(Number(s))
코드가 문제란 것은 알았습니다.
저기가 아니면 문제가 날 곳이 없었거든요.
결국은 문자열의 ASCII 코드를 비교하는 연산을 수행해야 했습니다.
그렇게 끝나려는 무렵 다른 사람들이 한 질문을 보니 다 저와 같은 케이스에서 오류가 나더라고요.
오류는 바로 "12.1"과 같은 소수점이 있는 케이스였습니다.
그렇죠.. "12.1" Number에 들어가도 숫자로 나오고 문자열이 4개 또는 6개로 나오는게 가능한...
이처럼 사용자의 입력은 우리가 예측보다 한 단계 위에 있다는 것을 다시 한 번 뼈져리게 느꼈습니다.