728x90
문제 & 제한사항
문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요.
예를 들어 s가 "a234
"이면 False
를 리턴하고 "1234
"라면 True
를 리턴하면 됩니다.
제한사항
s
는 길이 1 이상, 길이 8 이하인 문자열입니다.s
는 영문 알파벳 대소문자 또는 0부터 9까지 숫자로 이루어져 있습니다.
입출력 예
s | return |
---|---|
"a234" | false |
"1234" | true |
풀이 방법
- 먼저 s의 길이가 4 또는 6을 만족해야 하기 때문에 if문을 활용했다.
- 주어진 문자열을 순회 하면서 만약 숫자로 변환 했을 때, 숫자가 아니면 false를 숫자면 true를 반환하도록 한다.
- 만약 s의 길이가 4 또는 6을 만족하지 않으면 바로 false를 반환하도록 작성했다.
코드
function solution(s) {
if (s.length === 4 || s.length === 6) {
for (let i = 0; i < s.length; i++) {
if (Number.isNaN(parseInt(s[i]))) {
// console.log(parseInt(s[i]));
return false;
}
}
return true;
}
return false;
}
// console.log(!Number.isNaN("3e10"));
새롭게 알게 된 점
Number.isNaN()
과isNaN()
의 차이
Number.isNaN()
과 isNaN()
은 둘 다 주어진 값이 NaN(Not a Number)인지 확인하는데 사용된다.
하지만 isNaN()
보다 Number.isNaN()
이 엄격하게 비교하기 때문에 값이 NaN
인지 확인해야 할 때는 Number.isNaN()
을 사용하게 권장되고 있다.
Number.isNaN(NaN); // true
Number.isNaN(undefined); // false
Number.isNaN("NaN"); // false
Number.isNaN(123); // false
isNaN(NaN); // true
isNaN(undefined); // true
isNaN("NaN"); // true
isNaN(123); // false
지수 표기법으로 인해 자동으로 숫자로 변하는 것에 대한 주의
해당 문제에서의 테스트 케이스에는 "10e1”, "0001e0”처럼 문자열이 지수 표기법으로 이루어져 있을 때에도 false
로 반환해야 정답 처리가 되었다.
처음에는 단순히 문자열 s 전체가 숫자로 변환 했을 때. 숫자인지 아닌지 확인만 했었는데 위와 같은 테스트케이스에서 계속 실패를 했었다.
이후, 문자열 하나씩 순회하면서 parseInt()
로 숫자로 변환하고, 문자열인 경우 parseInt()
는 NaN
을 반환하기 때문에 Number.isNaN()
으로 반환 되었던 NaN
을 false
처리를 하게 했다.
느낀 점
다른 사람들의 풀이를 봤을 때, 정규표현식을 사용했던 분도 있었다.
하지만 정규표현식을 외우지 않는 한 반례를 최대한 스스로 생각해내고, 그에 맞는 예외 처리의 중요성을 깨닫게 되었다.
더보기
- 문제 링크
- 참고 자료
728x90