문제정보
문자열이 매개변수로 주어지는데 소문자 대문자 자연수가 섞여있는 문자열이네요
그 사이에서 자연수값들만 찾아서 더해주면 되는 문제인데
한가지 까다로운점이 연속된 수는 하나의 숫자로 간주한다는 것이었습니다.
저는 어떻게 해결할지 생각해보다가
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로 값을 합쳐주면 끝
반응형
'programmers' 카테고리의 다른 글
[Programmers Level 1] [1차]비밀지도 Javascript (0) | 2022.12.07 |
---|---|
[Programmers Level 0] 캐릭터의 좌표 Javascript (0) | 2022.12.02 |
[Programmers Level 0] 치킨 쿠폰 Javascript (0) | 2022.11.30 |
[Programmers Level 0] 외계어사전 Javascript (1) | 2022.11.30 |
[Programmers Level 0] 문자열 밀기 Javascript (0) | 2022.11.30 |