[코딩 테스트] 숨어있는 숫자의 덧셈(2)
문자열 my_string이 매개변수로 주어집니다. my_string은 소문자, 대문자, 자연수로만 구성되어있습니다.
my_string안의 자연수들의 합을 return하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ my_string 안의 자연수 ≤ 1000
연속된 수는 하나의 숫자로 간주합니다.
000123과 같이 0이 선행하는 경우는 없습니다.
문자열에 자연수가 없는 경우 0을 return 해주세요.
입출력 예
my_string, result
"aAb1B2cC34oOp", 37
"1a2b3c4d123Z", 133
풀이
#include <string>
#include <vector>
#include <sstream>
using namespace std;
int solution(string my_string) {
int answer = 0;
for (int i = 0; i < my_string.size(); i++){
if((my_string[i]-'0') > 10) my_string[i] = ' ';
}
stringstream ss(my_string);
int tmp;
while (ss >> tmp) answer += tmp;
return answer;
}
인자로 받은 my_string을 순회한다. ( 이때 index를 사용하여 순회 )
my_string[i]-‘0’ 을 사용하여, char값을 아스키코드로 변환한다. 0 ~ 9의 아스키코드는 그대로 0 ~ 9 이기에
값이 10보다 클 경우, 주어진 제한 조건에 따라 해당 char은 숫자가 아닌 문자이고, 이를 공백으로 처리한다.
for 반복문을 끝내면 my_string은 다음과 같이 바뀌게 된다.
"aAb1B2cC34oOp" -> " 1 2 34 " 이후 stringstream을 이용하면 공백을 분리할 수 있게 된다.
while (ss » tmp) 반복문을 사용하여, 공백 기준 분리된 문자열을 임시 정수형 변수 tmp에 저장하고
tmp값을 최종 결과 변수에 더하여 준다. 마지막으로 answer를 반환하며 함수를 종료한다.
아스키코드를 이용한 문자의 타입 확인,
아스키코드는 16진수이기에 0 ~ 9의 값은 기존 10진수 숫자와 동일