문제설명
문자열 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) && s == parseInt(s)
}
아오 진짜.... if문에서 isNaN() 써보고 Number()도 써봤는데 테스트11에서 걸렸다.
어떤분은 parseInt()와 Number()를 동일하게 사용하면 틀렸다고 뜨니 변수를 따로 만들어 변수는 Number(), 비교할때는 parseInt()로 비교해 통과했다고 한다. 그 게시물을 보고 고민하다가 아예 그냥 parseInt()를 비교하는걸로 테스트해보니 통과되었다.
'==='가 아닌 '=='를 사용한 이유
- '==' 서로 다른 유형의 두 변수의 값만 비교 (값 -> true) | 자료형은 판단하지 않는다
- '===' 더 엄격하게 비교 (값 & 자료형 -> true) | 권장사항
isNaN, Number가 안되는 이유
https://programmers.co.kr/questions/14419
- 문자열의 각 문자가 모두 숫자로되어있는지 확인 하는 것이므로 정수만 가능하다. === 소수는 안된다.
isNaN
이 문제에서 요구하는 것처럼 우리가 원하는 '숫자'를 찾아내기엔 무리가 있다.
숫자가 아닌 값도 true로 걸리는 등... 원하는 답을 명확히 찾기 어렵다.
실제로 '0.5'라는 소수를 isNaN로 확인해보았을때 false로 나온다.
Number
ex) '0.5' === 0.5
해당 문자열의 숫자를 있는 그대로 출력한다.
문자열 내에 숫자 말고도 문자가 섞여있으면 무조건 NaN로 나온다.
parseInt
ex) '0.5' === 0
소수를 출력해도 해당 소수점은 다 자르고 정수만 나온다.
문자열 내에 숫자 말고도 문자가 섞여있어도 숫자만 그대로 출력해주는 기능이 있다.
결론: isNaN, Number를 사용하면 틀리고 parseInt를 사용해야 한다.
+ 21.07.19 코드 수정
아무래도 '=='연산자는 사용을 하지 않는게 가장 좋아서 코드를 수정해보았습니다.
구글링 하던 도중 isNaN으로도 테스트를 통과한 분들도 있었습니다. (소스 구조는 달랐습니다!) 그거보자마자 멘붕...🤯 뭐지 ㅋㅋㅋ 더 공부해봐야겠습니다....아....아흐흑
우선 가장 편리한 방법은 정규표현식을 사용하는 겁니다.
function solution(s) {
return (s.length===4 || s.length===6) && /^[0-9]+$/.test(s);
}
- test() 메서드는 주어진 문자열이 정규 표현식을 만족하는지 판별하고, 그 여부를 true 또는 false로 반환합니다.
- ^ : 시작
- [0-9] : 0~9까지의 숫자
- + : 반복, 앞의 문자가 1개 이상인 경우
- $ : 종료
/^[0-9]*$/ 가 숫자만 있는지 확인할때 가장 많이 쓰는 방법이라고 합니다. 정리가 잘된 링크가 있어 공유합니다.
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=jeongju02&logNo=221517177533
'ALGORITHM > PROGRAMMERS' 카테고리의 다른 글
[프로그래머스] 자연수 뒤집어 배열로 만들기 | javascript (0) | 2021.07.10 |
---|---|
[프로그래머스] 나누어 떨어지는 숫자 배열 | javascript (0) | 2021.07.09 |
[프로그래머스] 자릿수 더하기 | javascript (0) | 2021.07.09 |
[프로그래머스] 약수의 개수와 덧셈 | javascript (2) | 2021.07.03 |
[프로그래머스] 서울에서 김서방 찾기 | javascript (0) | 2021.07.02 |