프로그래머스 - 숨어있는 숫자의 덧셈 (2)

Lellow_Mellow·2023년 4월 10일
1
post-thumbnail

⭐ Lv. 0 - 숨어있는 숫자의 덧셈 (2)

✅ 문제 설명

문자열 my_string이 매개변수로 주어집니다. my_string은 소문자, 대문자, 자연수로만 구성되어있습니다. my_string안의 자연수들의 합을 return하도록 solution 함수를 완성해주세요.

✅ 제한사항

  • 1 ≤ my_string의 길이 ≤ 1,000
  • 1 ≤ my_string 안의 자연수 ≤ 1000
  • 연속된 수는 하나의 숫자로 간주합니다.
  • 000123과 같이 0이 선행하는 경우는 없습니다.
  • 문자열에 자연수가 없는 경우 0을 return 해주세요.

✅ 입출력 예

my_stringresult
"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합니다.

✅ 풀이 코드 + 설명

문자열을 문자 단위로 하나씩 탐색해서 해결할 수도 있겠지만, replace를 활용해서 풀이하였습니다. replace는 단순히 문자나 문자열을 넘겨주면 1번만 교체하지만, 정규표현식을 넘겨주면 relaceAll처럼 문자열 내부의 정규표현식과 일치하는 부분 전체를 변경해줍니다.

첫 풀이는 아래와 같이 작성하였습니다. gi로 전체 문자열에 대해서 대소문자를 무시하고 a부터 z까지 영문에 해당하는 연속된 문자열을 공백으로 replace 하였습니다.

이후 공백 기준으로 문자열을 나누고, 공백을 제외한 숫자만 포함된 배열을 저장하여 reduce를 이용해 배열 원소의 누적합을 계산하였습니다.

function solution(my_string) {
    let array = my_string.replace(/[a-z]+/gi, " ").split(" ").filter((cur) => cur !== " ");
    return Number(array.reduce((cur, sum) => sum = Number(sum) + Number(cur)));
}

이보다 더 간단한 풀이도 있었습니다.

function solution(my_string) {
    return my_string.split(/\D+/).reduce((sum, cur) => sum + Number(cur), 0);
}

split 역시 정규표현식을 기준으로 구분이 가능했습니다. 또한 reduce의 경우, 초기값을 0으로 설정하면 다음과 같이 더 간결한 코드로 구현이 가능했습니다.

profile
잔잔한 물결에서 파도로, 도약을 위한 도전. 함께하는 성장

0개의 댓글