[js] 숨어있는 숫자의 덧셈 (2) (lv.0)

sookyoung.k·2024년 5월 28일
post-thumbnail

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

제한사항

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

나의 풀이

function solution(my_string) {
    // 정규표현식을 사용해서 알파벳 소문자, 대문자를 제거함 
    let stringArr = my_string.replace(/[A-z]/g, " ").split(" ");
    return stringArr.reduce((acc, cur) => {
        if(!isNaN(+cur)) return acc += +cur;
    }, 0)
}
  • 정규표현식을 사용해서 알파벳 소문자, 대문자를 replace() 함수를 사용하여 제거한다. 그 후 배열로 쪼개기.
  • reduce() 함수를 통해서 누적 합산값을 구한다.
    - if 조건문을 통해서 현재 요소(cur)가 숫자인지 판별한다. (isNaN 사용)
    • 숫자일 경우에만 누적값과 합산하여 그 결과 반환

다른 풀이 1

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

정규표현식을 활용하는 방법은 정말 무궁무진하군...

  • 정규 표현식을 사용하여 문자열을 분할한다. my_string.split(/\D+/) 여기서 \D+는 하나 이상의 숫자가 아닌 문자를 의미한다. 문자열에서 숫자가 아닌 문자들을 기준으로 문자열을 분할하여 숫자만 남기는 배열을 만들어준다.
  • reduce() 함수를 사용하여 숫자로만 이루어진 배열의 모든 요소를 순환하며 누적합산값을 구한다.

다른 풀이 2

function solution(my_string) {
    return my_string.toLowerCase().replace(/[a-z]/g, " ").split(" ").map((v) => v*1).reduce((a,b) => a+b)
}
  • 소문자로 변환하여 replace() 함수로 문자열 내의 모든 영문자를 공백으로 대체한다. 그 후 split() 함수를 사용해 공백을 기준으로 문자열을 분리하여 배열을 생성한다.
  • map() 함수를 사용하여 배열 내의 문자를 숫자로 변환한다. (v*1은 문자열 v를 숫자로 강제 변환하는 간단한 방법으로, 빈 문자의 경우 이 방법을 사용할 시 0으로 변한다.)
  • reduce() 함수를 통해 누적 합산값을 계산한다.

.replace(/[A-z]/g, " ")로 하시면 대문자 소문자 모두 포함해서 .toLowerCase()가 필요없습니다.

profile
영차영차 😎

0개의 댓글