문제설명
문자열 my_string이 매개변수로 주어집니다. my_string안의 모든 자연수들의 합을 return하도록 solution 함수를 완성해주세요.
function solution(my_string) {
let answer = my_string.replace(/[^0-9]/g,'')
.split("")
.map((answer) => Number(answer))
.reduce((prev, cur) => {return prev+cur},0);
return answer;}
solution("aAb1B2cC34oOp")
나의 문제풀이는 총 6단계로 진행되었다. 물론 더 단순하게 접근할 수 있는 코드가 있을 것이지만, 나의 아는 것을 총동원해서 문제를 불어보았다.
정규표현식
my_string.replace(/[^0-9]/g,'') 해당부분이 구글에서 어시스트 받은 부분이었다. 배열을 잘라서 숫자로 변형했는데, NaN(숫자가 아님)을 배열에서 조건문으로 제거하려고 했지만 되지 않았다. 그래서 찾아봤더니 정규표현식 부분을 참고했다. 문자변경하기
replace(/[^0-9]/g,'') 정규표현식으로 찾은 문자를 공백으로 변경한다. 문자열자르기
split("") 공백단위로 문자열을 잘랐다. map() 메소드
map((answer) => Number(answer) 반복문을 돌며, 인자 하나하나를 숫자열로 형변환시킨다. 누계계산기
reduce()메소드를 사용하여, 추출한 숫자를 누계하여 합산한다. function solution(my_string) {
return my_string.split("")
.filter((v)=> !isNaN(v))
.reduce((a,b) => parseInt(a)+parseInt(b));
}
결국 reduce() 메소드를 사용하는 부분은 동일했다. 차이점은 filter() 메소드의 활용이었다. .filter((v)=> !isNaN(v)) 내용을 보면, 인자 하나에서 isNaN 이 아닌 것만 결과값으로 리턴한다. 내가 조건문에서 NaN으로 하고 싶었던 부분을 여기서 방법을 찾았다. 그 내용에 대해서 reduce()를 진행했는데, 현재 인자가 문자열이기에 해당 내용을 parseInt()메소드를 통해서 정수라는 것을 선언한 것 같다.
function solution(my_string) {
return my_string.match(/[0-9]/g)
.reduce((a,b) => parseInt(a)+parseInt(b));
}
풀이 역시 reduce() 메소드를 사용하는 부분은 동일했다. 여기서는 match()메소드를 했다. match()는 특정 텍스트 안에 검색할 단어가 포함되어 있는지 검색한다. 인자에서 해당내용을 찾으면 이를 반환한다. 그리고 인자로는 정규표현식으로 해당 내용을 찾았다. 내가 찾은 방법에서는 [^0-9]를 통해 숫자가 아닌 문자를 추출해서 공백으로 바꾸는 등으로 작업을 했던 것과 다르게 간략하게 처리했다. 내가 replace()
, split()
, map()
를 통해서 작업었던 것을 단순화시킨 점에 놀란다.