본문 바로가기
알고리즘/Programmers

[TIL] 2023.08.16 Programmers_숨어있는 숫자의 덧셈 (2)

by heereal 2023. 8. 16.

숨어있는 숫자의 덧셈 (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번과 비교했을 때는 비효율적인 풀이인 거 같다.

 

 

댓글