Description
문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.
Constraints
s는 길이 1 이상, 길이 8 이하인 문자열입니다.
My Solution
function solution(s) {
if (s.length === 4 || s.length === 6) {
if (s.includes('e')) return false;
return !isNaN(s);
} else return false;
}
가장 처음의 조건으로는 문자열의 길이가 4 또는 6이어야 하고, 그렇지 않으면 false를 리턴한다.
문자열의 길이 조건을 통과했다면, 그 문자열에 'e'가 포함되어 있는지 판별하고, 만약 e가 있다면 false를 리턴한다.
- 처음에는 이것을 포함하지 않았었는데, 테스트 케이스 11번만 통과하지 못했다. 이유는 바로 자바스크립트에서 e는 지수로 쓰이기 때문에 "7.7e+4" 같이 e가 들어간 문자열도 숫자로 평가되기 때문.
- 즉 e가 있다고 해서 숫자로 판단하는 것이 아닌 문자열로 판단하기 위해 조건을 추가하였다.
e가 포함되어 있지 않다면 isNaN 함수의 결과를 ! 연산자를 이용해서 참이면 거짓으로, 거짓이면 참으로 반환한다.
- isNaN은 NaN이면, 즉 숫자가 아니면 true를 반환한다. 그런데 숫자일 때 true를 반환해야 하므로 !(not) 연산자를 써 준 것.
- 참고로 '', ' ' (empty string, 공백으로만 된 스트링)은 숫자로 0으로 변환된다. 그래서 isNaN 하면 false이다.
Other's Solutions
Array.prototype.every()
function solution(s) {
const len = s.length;
if (len === 4 || len === 6) {
return s.split('').every(c => !isNaN(c));
}
return false;
}
문자열을 split('')으로 요소 하나하나를 배열로 만든 뒤, every로 그 모든 요소가 주어진 조건을 통과하면 true를, 그렇지 않으면 false를 리턴한다.
Regular expressions
function solution(s) {
var regex = /^\d{6}$|^\d{4}$/;
return regex.test(s);
}
정규식 리터럴은 슬래시(/)로 감싸서 사용한다.
^ : 입력의 시작 부분에 대응된다.
$ : 입력의 끝 부분과 대응된다.
{n} 이런 식으로 { } 안에 양의 정수를 넣어서 앞의 표현식이 n번 나타나는 부분에 대응된다. 여기서는 숫자가 6번 또는 4번 나타나는지 확인하는 용도로 쓰였다.
\d : 숫자 문자에 대응된다. [0-9]와 동일하다.
| : or 이다.
test() 메서드는 주어진 문자열이 정규 표현식을 만족하는지 판별하고, 그 여부를 true 또는 false로 반환한다.
즉 주어진 문자열이 길이가 4거나 6인 숫자인지를 검사하는 정규 표현식.
Reference
https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Regular_Expressions
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test
'Algorithms > Programmers' 카테고리의 다른 글
[프로그래머스 Level 1] 두 정수 사이의 합 (자바스크립트) (0) | 2021.10.16 |
---|---|
[프로그래머스 Level 1] 문자열 내림차순으로 정렬하기 (자바스크립트) (0) | 2021.10.14 |
[프로그래머스 Level 1] 수박수박수박수박수박수? (자바스크립트) (0) | 2021.10.12 |
[프로그래머스 Level 1] 최대공약수와 최소공배수 (자바스크립트) (0) | 2021.10.10 |
[프로그래머스 Level 1] 자연수 뒤집어 배열로 만들기 (자바스크립트) (0) | 2021.10.10 |