programmers

[Programmers Level 0] 숨어있는 숫자의 덧셈(2) Javascript

냠냠맨 2022. 12. 1. 12:32

문제정보

 

문자열이 매개변수로 주어지는데 소문자 대문자 자연수가 섞여있는 문자열이네요

그 사이에서 자연수값들만 찾아서 더해주면 되는 문제인데

한가지 까다로운점이 연속된 수는 하나의 숫자로 간주한다는 것이었습니다.

 

저는 어떻게 해결할지 생각해보다가

charCodeAt을 통해 아스키코드로 문제를 푸는 방법을 택했습니다.

숫자 0~9의 아스키코드는 48~57이니까

대문자는 65~90

소문자는 97~122 이고 소문자 대문자 자연수만으로 구성되어있으니

아스키코드가 57보다 크면 일단 숫자는 아니겠군요


 

예시

 

my_string	result
"aAb1B2cC34oOp"	37
"1a2b3c4d123Z"	133

 

 


 

 

나의풀이

 

function solution(my_string) {
    let answer = 0
    let counter = ''
    for(i=0 ; i<my_string.length ; i++) {
        if( my_string.charCodeAt(i) < 58) {
            counter += my_string[i]
            if(my_string.charCodeAt(i+1) > 57 ||my_string[i+1] == undefined ) {
                answer += Number(counter)
                counter = ''
            }
        }
    }
    return answer
}

 

if를 두개 걸어서 풀었습니다

charCodeAt은 문자열.charCodeAt(인덱스)를 통해 해당 인덱스의 아스키코드값을 반환합니다.

그러니까 아스키코드값이 58이하이면 counter에 숫자를 저장해주고

만약 다음 인덱스가 숫자가 아니라면 연속이 끊기게되니까 answer에 counter값을 정수로 만들어서 더해준 뒤

counter를 초기화시켜줬습니다.

i+1이 인덱스값을 초과하면 undefined가 반환되니까

undefined인 경우도 or연산자로 처리해줬습니다.

 

이걸 반복하면 답을 구할 수 있겠네요

 


 

 

 

다른사람의 풀이

 

 

function solution(my_string) {
    return my_string.toLowerCase().replace(/[a-z]/g, " ").split(" ").map((v) => v*1).reduce((a,b) => a+b)
}

 

 

lowercase로 모든 알파벳을 소문자로 만들고

replace와 정규표현식으로 모든 알파벳들을 공백으로 만든다음

split을 공백기준으로 해주면 연속된수들은 붙어있는 채로 split이 되겠네요

그 다음 map과 사칙연산자를 통해서 각 요소들을 숫자로 만들어주고

reduce로 값을 합쳐주면 끝

 

 

반응형