문자열 my_string이 매개변수로 주어집니다. my_string은 소문자, 대문자, 자연수로만 구성되어있습니다. my_string안의 자연수들의 합을 return하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ my_string의 길이 ≤ 1,000
1 ≤ my_string 안의 자연수 ≤ 1000
연속된 수는 하나의 숫자로 간주합니다.
000123과 같이 0이 선행하는 경우는 없습니다.
문자열에 자연수가 없는 경우 0을 return 해주세요.
입출력 예
my_string | result |
---|---|
"aAb1B2cC34oOp" | 37 |
"1a2b3c4d123Z" | 133 |
function solution(my_string) {
let arr = my_string.split("").filter(el => el*0 !== 0)
for(let el of arr){
my_string = my_string.split(el).join(",")
}
return my_string.split(",").reduce((누적,현재)=>누적+Number(현재),0)
}
arr
을 생성let arr = my_string.split("").filter(el => el*0 !== 0)
// my_string = "aA34oa1O"
// arr = ["a","A","o","a","O"]
arr
의 요소el
을 기준으로 split()하고 콤마(,)
를 기준으로 join()해서 재할당하는 과정으로 순회한다for(let el of arr){
my_string = my_string.split(el).join(",")
}
// arr = ["a","A","o","a","O"]
// 0회차:
// my_string.split("a") = ["", "A34o", "1O"]
// > my_string = ",A34o,1O"
// 1회차:
// my_string.split("A") = [",", "34o,1O"]
// > my_string = ",,34o,1O"
// 2회차:
// my_string.split("o") = [",,34", ",1O"]
// > my_string = ",,34,,1O"
// 3회차:
// my_string.split("a") = [",,34,,1O"]
// > my_string = ",,34,,1O"
// 4회차:
// my_string.split("O") = [",,34,,1", ""]
// > my_string = ",,34,,1,"
콤마(,)
를 기준으로 split()한 배열의 요소의 합을 반환한다return my_string.split(",").reduce((누적,현재)=>누적+Number(현재),0)
// my_string.split(",") = ["", "", "34", "", "1", ""]
// my_string.split(",").reduce((누적,현재)=>누적+Number(현재),0) = 35
function solution(my_string) {
if(my_string*0 === 0) return Number(my_string)
let char = my_string.split("").filter(el => el*0 !== 0)
// 중복없는 배열을 굳이 만들어줄 필요는 없었다
// const obj = {}
// for(let i in char){
// obj[char[i]] = 0
// }
// char = Object.keys(obj)
let num = []
for(let el of char){
let a = my_string.split(el)
for(let i in a){
if(a[i]*0 === 0){
num.push(a[i])
a[i] = ""
}
}
my_string = a.join("")
}
return num.map(el=>Number(el)).reduce((누적,현재)=>누적+현재,0)
}
char
로 반환한다let char = my_string.split("").filter(el => el*0 !== 0)
char
의 요소el
을 기준으로 순회하여 my_string을 split()한 배열 a
에 대하여for(let el of char){
let a = my_string.split(el)
// 이하 3~4.
}
a
의 요소a[i]
가 숫자라면 빈 배열num
에 추가하고 a[i]
에는 빈문자열""을 재할당한다for(let i in a){
if(a[i]*0 === 0){
num.push(a[i])
a[i] = ""
}
}
a
를 join()한 결과를 my_string에 재할당한다my_string = a.join("")
num
의 요소el
을 숫자로 변환하고 요소의 합을 반환한다return num.map(el=>Number(el)).reduce((누적,현재)=>누적+현재,0)
my_string이 숫자로만 이루어진 경우 0이 반환되므로 최상단에 아래 조건을 추가했더니 테스트 6,7번이 해결됐다
if(my_string*0 === 0) return Number(my_string)
근데 아직 테스트 1번이 해결되지 않았다 조건이 뭘까?
function solution(my_string) {
return my_string.replace(/[A-z]/g, " ").split(" ").map((v) => v*1).reduce((a,b) => a+b)
}
function solution(my_string) {
return my_string.split(/\D+/).reduce((acc, cur) => acc + Number(cur), 0);
}
[javascript] 자주 사용하는 정규 표현식 (Regular Expression) 정리
\D
: 숫자가 아닌 문자
\D+
: 숫자가 아닌 하나 이상의 문자
[A-z]
: A~z중 하나의 문자
/g
정규 표현식 뒤의 "g"는 전체 문자열을 탐색해서 모든 일치를 반환하도록 지정하는 전역 탐색 플래그입니다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Regular_Expressions