문자열 my_string이 매개변수로 주어집니다. my_string은 소문자, 대문자, 자연수로만 구성되어있습니다. my_string안의 자연수들의 합을 return하도록 solution 함수를 완성해주세요.
연속된 수를 하나의 숫자로 간주한다는 조건을 충족하기 위해 StringBuffer 객체를 사용했다. my_string의 문자들을 charAt()으로 하나씩 받은 다음, isDigit() 메서드로 해당 Char가 숫자인지 체크해 주었다. 솔직히 말하면 배웠는데 잊고 있던 메서드였다. 아스키코드를 이용하자니 코드가 아무리 생각해도 지저분해져서 서치하다가 발견^^;
숫자일 경우, append()로 버퍼 객체에 누적한다. 다음에 나오는 문자가 숫자인지 아닌지 확인이 필요하기 때문에 바로 더해주지 않는 것이다. 그렇게 누적하는 과정에서 숫자가 아니라면, 그때 버퍼 객체를 파싱한 다음 answer에 더해 주고, setLength()를 통해 초기화 한다.
이때 중요한 것은 아직 숫자가 등장하지 않아 버퍼 객체가 비어 있을 경우 Integer.parseInt()로 파싱하려고 하면 NumberFormatException이 발생한다는 점이다. 따라서 if(num.length() != 0)으로 누적되어 있는 숫자들이 있을 때만 위 작업을 수행하게끔 조건을 추가해 주어야 한다.
마지막으로 my_string이 aEDb1be89ddTY123처럼 숫자로 끝나는 문자열이라고 가정해 보자. 그렇다면, 루프를 다 돌았는데도 buffer에 마지막으로 누적된 123은 숫자가 아닌 문자를 만나지 못해 answer에 더해지지 않게 된다. 이를 처리하는 코드를 삼항 연산자로 하나 더 추가해 주었다.
class Solution {
public int solution(String my_string) {
int answer = 0;
StringBuffer num = new StringBuffer();
for(int i=0; i<my_string.length(); i++){
Character c = my_string.charAt(i);
if(Character.isDigit(c)){
num.append(c);
}else{
if(num.length() != 0){
answer += Integer.parseInt(num.toString());
num.setLength(0);
}
}
}
answer += (num.length() != 0) ? Integer.parseInt(num.toString()) : 0;
return answer;
}
}
