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

송철진·2023년 1월 1일
0

문제 설명

문자열 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

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)
}

풀이

  1. my_string의 숫자가 아닌 각 문자를 필터링한 배열 arr을 생성
let arr = my_string.split("").filter(el => el*0 !== 0)

// my_string = "aA34oa1O"
// arr = ["a","A","o","a","O"]
  1. my_string을 배열 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,"
  1. my_string을 콤마(,)를 기준으로 split()한 배열의 요소의 합을 반환한다
return my_string.split(",").reduce((누적,현재)=>누적+Number(현재),0)

// my_string.split(",") = ["", "", "34", "", "1", ""]
// my_string.split(",").reduce((누적,현재)=>누적+Number(현재),0) = 35

나의 코드2 ( 테스트 1번❌ )

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)
}

풀이

  1. my_string에 포함된 문자를 배열 char로 반환한다
let char = my_string.split("").filter(el => el*0 !== 0)
  1. 배열 char의 요소el을 기준으로 순회하여 my_string을 split()한 배열 a에 대하여
for(let el of char){
	let a = my_string.split(el)
    // 이하 3~4.
}
  1. 배열 a의 요소a[i]가 숫자라면 빈 배열num에 추가하고 a[i]에는 빈문자열""을 재할당한다
for(let i in a){
    if(a[i]*0 === 0){
        num.push(a[i])
        a[i] = ""
    }     
}
  1. 배열 a를 join()한 결과를 my_string에 재할당한다
my_string = a.join("")
  1. 순회가 끝나면 배열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번이 해결되지 않았다 조건이 뭘까?

다른 풀이(스크랩)

  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

profile
검색하고 기록하며 학습하는 백엔드 개발자

0개의 댓글