문제를 보면 my_string이 매개변수로 주어지고,
my_string안의 모든 자연수들의 합을 return하라고 한다.
대신에 연속된 숫자는 ex. 111이면 111이 아닌 1,1,1 이다.
my_string에는 숫자만 있는게 아닌 문자와 섞여있는 문자열 형태이고,
처음 이를 해결하기 위해서 정규 표식을 가져다 사용했다.
function solution(my_string) {
const regex = /[^0-9]/g;
const number = my_string.replace(regex, "").split('')
const result = number.map(Number)
return result.reduce((a, b) => a + b)
}
정규 표현식을 사용해서 숫자가 아닌건 모두 찾는 패턴
replace를 이용해서 숫자가 아니면 없애고, (첫 예제로 보면 이때 my_string은 "1234")
split을 이용해서 "1234"를 배열의 형태로 쪼개준다. (["1", "2", "3", "4"])
그리고 map메서드를 이용해서 문자열을 숫자열로 변경
["1", "2", "3", "4"]를 [1, 2, 3, 4]로
reduce를 사용해서 [1, 2, 3, 4]의 모든 값을 더 해준다.
function solution(my_string) {
return [...my_string].reduce((a, b) => Number(b) ? a + +b : a,0)
}
위에 풀이와 다른 점은 reduce를 이용해서 간단하게 바로 푸는 방법이다.
my_string을 전개연산자를 이용해서 배열의 형태로 만들고
reduce를 사용해서 더하는데, a는 누산기이고, b는 현재 값이다
삼항 연산자를 이용해서
Number(b)가 숫자면 누산 + 현재 인데,
보면 a + +b의 형태로 되어있다.
+단항 연산자를 이용해서 my_string 배열에 있는 문자열 숫자를 숫자열로 변경하는 부분이다.
단항 연산자는 피연산자 앞에 붙으면 피연산자를 숫자열로 변경한다.
그냥 a + b이면 0 + "1" 이 되버린다. (결과값이 "01234"가 된다.)
하지만 단항 연산자를 사용하면, Number를 사용하지 않고 간단하게
0 + 1이 된다. (결과값은 0 + 1 + 2 + 3 + 4 = 10)
그리고 Number(b)가 숫자가 아니면 0을 반환한다.
댓글