프로그래머스 문제 풀기

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

유니유뉘 2023. 3. 27. 13:54
728x90

숨어있는 숫자의 덧셈(2) 문제 풀어보기!

문제 )
 문자열 my_string이 매개변수로 주어지는데 소문자, 대문자, 자연수로만 구성되어 있다.
매개 변수 안의 자연수들의 합을 return하라. 

예시로 my_string = "aAb1B2cC34oOp"이라면 반환해야 할 값은 37이다. ( 1+2+34 = 37 )

 

내가 생각한 코드 작성 단계는 첫 번째, 먼저 자연수만 남길 수 있도록 하기. 두 번째 남겨진 자연수들을 합해서 리턴하기로 이루어져 있다.

자연수만 남기기 위해선 정규표현식을 사용해야 훨씬 편리하다는 것을 알았다.

/[^a-zA-Z]+/g -> 이 정규식 표현을 사용해 문자열을 필터링할 것이다.

const fil = /[^a-zA-Z]+/g;
let number = my_string.match(fil);
//["1","2","34"];

이를 fil이란 변수에 저장한 후 my_string에서 문자열을 필터링하고 필터링한 (자연수만 남아있는) 값을 number라는 변수에 담아준다. 그러면 number에는 자연수만 남는데 console.log를 찍어보면 알 수 있다. 

let answer = 0;
number.map((x,i)=> answer += Number(number[i]));
return answer;

더한 값들을 저장할 변수 answer를 만들어두고 이제 map 함수를 이용해 각각의 숫자를 더해주면 된다.

그러면 answer에는 37이 리턴이 된다.

하지만 제출 후 채점했을 때 테스트 8 에러로 통과하지 못했다. 그 이유는 my_string에 자연수가 없을 경우를 고려하지 못했기 때문이다. 그래서 if문을 사용해 자연수가 없을 땐 0을 리턴하도록 했다.

let answer = 0;

if(!number){
	return 0;
}else if(number){
	number.map((x,i)=> answer += Number(number[i]));
    return answer;
}

 

최종 코드

 

function solution(my_string) {
   const fil = /[^a-zA-Z]+/g;
    let answer = 0;
    let number = (my_string.match(fil));
    
    if(!number){
        return 0;
    }else if(number){
        number.map((x,i)=> answer +=  Number(number[i])); 
        return answer;
    }
    
}

 

나의 주관적인 생각

결과적으로 테스트에 통과했지만 생각보다 필요하지 않는 코드로 구성되어 있어서 그런 게 아닐까 생각이 들었다.

그 이유는 러닝타임이 너무 오래걸렸기 때문이다. 그리고 다른 사람들이 작성한 코드랑 비교하면 위의 코드가 긴 편에 속한다.

이 코드를 수정한다면 불필요한 코드가 무엇이었을지 파악하고 그것을 수정하여 런타임을 줄이는데 목표를 잡아야겠다.

반응형