![프로그래머스 자바스크립트 숨어있는 숫자의 덧셈 (1)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmlEJG%2Fbtr5nHhlwhI%2FmOEHNvWno0JT0jY2HsqkmK%2Fimg.png)
- 문제 설명
문자열 my_string이 매개변수로 주어집니다.
my_string 안의 모든 자연수들의 합을 return하도록 solution 함수를 완성해주세요.
이 문제도 풀면서 머리가 꽤나 아팠던 기억이...
일단 합을 구할 것이기 때문에 변수 answer에 0을 담아주었다.
let answer = 0;
그리고 순회를 하면서 매핑을 할 수 있도록 my_string의 type을 배열로 변경해주기로 했다.
my_string.split(""); 이렇게 코드를 작성해주면 콘솔을 찍었을 때
[ "a", "A", "b", "1", "B", "2", "c", "C", "3", "4", "o", "O", "p" ] 이렇게 뜨게 됨.(예시)
이제 map()을 돌릴 건데 여기서 삼항연산자를 사용하여 숫자인 아이템은 answer에 더해주고, 그 외에는 0으로 바꿔줄 것임.
근데 첫 시도에는 삼항연산자 안에 Number.isNaN()를 쓰려고 했는데 오류가 떴다.
그래서 isNaN()으로 바꿔줬더니 정답을 출력해주었고.
이 둘의 차이가 뭘까? 궁금증이 생겨 서칭을 해본 결과,
Number.isNaN()은 isNaN()의 엄격한 버전이라고 한다. 숫자 타입이 아닐 경우 강제로 매개변수를 숫자로 변환하지 않고
있는 그대로의 상태로 주어진 값의 유형이 Number인지 아닌지를 판단한다.
그에 반해서 isNaN()은 숫자 타입이 아닐 경우 매개변수를 먼저 숫자로 형 변환한 후에 NaN인지 판별한다.
근데 우리의 코드를 살펴보면 my_string 배열에 담겨 있는 아이템들은 모두 문자임을 알 수 있다.
그런데 이 상태에서 Number.isNaN()를 사용하게 되면 숫자 타입이 아니므로 숫자로 변환해서 비교하는 대신
바로 맞냐, 틀렸냐를 판단하게 된다. 그런데 이렇게 되면 전부 문자열이므로 삼항연산자를 써서 얻을 수 있는 게 없다.
그러므로 여기서 우리는, isNaN()을 써 문자들 사이에서 숫자를 찾아준 후에 숫자로 형을 변환시켜주고 NaN을 판단해야 한다.
그럼 식을 한 번 작성해보자. isNaN()은 숫자가 아니면 true를 반환하므로 우리는 부정연산자를 사용하여 숫자일 때 true를
반환하도록 해보자. !isNaN(str) 이런 식으로. true가 나오면 str을 Number 형으로 변환시켜준 후(아까 isNaN()에서 숫자로 형 변환을 시키지 않았냐고? 숫자냐 아니냐를 판단할 때만 잠깐 형 변환을 하고 다시 원상복구 된다.) answer에 더해줄 것이다. false일 경우에는 0을 return.
function solution(my_string) {
let answer = 0;
my_string.split("").map((str) => !isNaN(str) ? answer += Number(str) : 0);
return answer;
}
여기서 우리는 고차함수를 조금 더 사용하여 코드를 다르게 짤 수 있다.
바로 고차함수 reduce를 사용하고 변수 answer을 없애주는 것~
function solution(my_string) {
return my_string.split("").reduce((sum, num) => {
if(!isNaN(num)){
sum += Number(num);
}
return sum;
}, 0);
}
'코딩테스트' 카테고리의 다른 글
프로그래머스 자바스크립트 약수의 개수와 덧셈 (0) | 2023.04.16 |
---|---|
프로그래머스 자바스크립트 암호 해독 (3) | 2023.03.23 |
프로그래머스 자바스크립트 모음 제거 (0) | 2023.03.22 |
프로그래머스 자바스크립트 문자열 안에 문자열 (0) | 2023.03.22 |
프로그래머스 자바스크립트 문자 반복 출력하기 (2) | 2023.03.22 |
github : https://github.com/dnjfht
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!