숨어있는 숫자의 덧셈 (2)
문제 설명
문자열 my_string이 매개변수로 주어집니다. my_string은 소문자, 대문자, 자연수로만 구성되어 있습니다.my_string안의 자연수들의 합을 return 하도록 solution 함수를 완성해 주세요.
입출력 예
my_string | result |
"aAb1B2cC34oOp" | 37 |
"1a2b3c4d123Z" | 133 |
입출력 예 #1
- "aAb1B2cC34oOp" 안의 자연수는 1, 2, 34입니다. 따라서 1 + 2 + 34 = 37을 return 합니다.
입출력 예 #2
- "1a2b3c4d123Z" 안의 자연수는 1, 2, 3, 4, 123입니다. 따라서 1 + 2 + 3 + 4 + 123 = 133을 return 합니다.
나의 풀이
function solution(my_string) {
let arr = my_string.match(/\d+/g);
return arr ? arr.reduce((acc, cur) => acc + Number(cur), 0) : 0;
}
처음부터 정규표현식을 사용해서 문제를 풀어본 건 처음인 거 같다. 어제인가 풀이에서 `match()` 메서드를 썼던 게 생각나서 바로 적용해 봤다. 사실 다른 사람들 풀이 보니까 삼항으로 예외 처리할 필요 없는 더 좋은 답안들도 있었던 거 같지만 이렇게 며칠 전에 배운 내용을 실제로 적용해서 문제를 풀 때가 너무 재밌는 거 같다!
`match()` 메서드로 my_string 문자열에서 숫자인 부분만 추출해서 배열을 생성한 후 `reduce()` 메서드로 모든 요소를 더해준다. 이렇게 풀었을 때 문자열에 자연수가 전혀 없는 경우에는 `match()` 메서드가 null을 반환해서 에러가 발생하기 때문에 `match()` 메서드를 적용한 결과물 arr가 null이 아닐 때만 `reduce()` 메서드를 사용하도록 예외 처리를 추가했다.
다른 사람의 풀이 01
function solution(my_string) {
return my_string.split(/\D+/).reduce((acc, cur) => acc + Number(cur), 0);
}
정규표현식으로 문자열인 부분을 추출해서 `split()`한다. `reduce()`부터는 나의 풀이 방법과 똑같다.
다른 사람의 풀이 02
function solution(my_string) {
return my_string.toLowerCase().replace(/[a-z]/g, " ").split(" ").map((v) => v*1).reduce((a,b) => a+b)
}
모든 문자열을 공백으로 변환한 후 공백을 기준으로 `split()`한다. 1번 풀이 방법과 접근 방식은 비슷한데 1번과 비교했을 때는 비효율적인 풀이인 거 같다.
'알고리즘 > Programmers' 카테고리의 다른 글
[TIL] 2023.08.23 Programmers_배열의 길이를 2의 거듭제곱으로 만들기 (0) | 2023.08.24 |
---|---|
[TIL] 2023.08.17 Programmers_커피 신부름 (0) | 2023.08.17 |
[TIL] 2023.08.15 Programmers_문자열 묶기 (0) | 2023.08.15 |
[TIL] 2023.08.14 Programmers_세 개의 구분자 (0) | 2023.08.15 |
[TIL] 2023.08.13 Programmers_빈 배열에 추가, 삭제하기 (0) | 2023.08.13 |
댓글