1 minute read

숨어있는 숫자의 덧셈 (1)

문제 설명

문자열 my_string이 매개변수로 주어집니다. my_string안의 모든 자연수들의 합을 return하도록 solution 함수를 완성해주세요.


제한사항

  • 1 ≤ my_string의 길이 ≤ 1,000
  • my_string은 소문자, 대문자 그리고 한자리 자연수로만 구성되어있습니다.

입출력 예

my_string result
“aAb1B2cC34oOp” 10
“1a2b3c4d123” 16

입출력 예 설명

입출력 예 #1

  • “aAb1B2cC34oOp”안의 한자리 자연수는 1, 2, 3, 4 입니다. 따라서 1 + 2 + 3 + 4 = 10 을 return합니다.

입출력 예 #2

  • “1a2b3c4d123Z”안의 한자리 자연수는 1, 2, 3, 4, 1, 2, 3 입니다. 따라서 1 + 2 + 3 + 4 + 1 + 2 + 3 = 16 을 return합니다.

나의 풀이 코드

import java.util.Arrays;

class Solution {
    public int solution(String my_string) {
        int answer = 0;
        int sum = 0;
        
        my_string = my_string.replaceAll("[a-zA-Z]", "");
        char[] arr = my_string.toCharArray();
        
        for(int i=0; i<arr.length; i++){
            sum += (int)(arr[i]-'0');  // 중요: -'0' 꼭 써야함.
        }
        answer = sum;
        return answer;
    }
}

대소문자 제거하고 자연수 문자들을 형변환해서 합한다.

배운점

class Solution {
    public int solution(String my_string) {
        int answer = 0;
        for(int i=0; i<my_string.length(); i++){
            if(Character.digit(my_string.charAt(i), 10) > 0){
                answer += Integer.parseInt(String.valueOf(my_string.charAt(i)));
            }
        }
        return answer;
    }
}

다른 사람이 푼 코드를 보면

숫자인지 판별하는 if문에는 Character.digit()메서드를 사용하는데 이는 문자를 숫자로 변환한다.
그리고 Character.digit()안에 10은 10진수를 의미한다.

이후 String.valueOf()을 써서 문자열로 바꾸고 Integer.parseInt()를 써서 정수로 변환한다.

새로 배운점 : 보통 문자열로 형 변환 시 toString()을 자주 사용하는데, null값을 문자열로 형 변환 시 NullPointerException를 발생시킨다. 반면 String.valueOf()를 사용하면 전달받은 파라미터가 null이 전달될 경우 문자열 “null”을 반환하기 때문에 String.valueOf()을 사용한다.

class Solution {
    public int solution(String my_string) {
        int answer = 0;

        for(char c : my_string.toCharArray()){
            if(c >= '0' && c <= '9'){
                answer += c - '0';
            }
        }
        return answer;
    }
}

또다른 사람이 푼 코드를 보면 아스키 코드로 조건문을 만들었다.

class Solution {
    public int solution(String myString) {
        return myString.chars()
                        .mapToObj(i -> (char) i)
                        .filter(Character::isDigit)
                        .map(String::valueOf)
                        .mapToInt(Integer::valueOf)
                        .sum();
    }
}

또다른 사람이 스트림으로 풀은 코드를 보면

chars() 메서드를 사용하여 문자열의 각 문자로 구성된 스트림으로 변환하고,
mapToObj(i -> (char) i) 코드로 문자를 문자형으로 변환하고,
filter(Character::isDigit) 코드로 숫자인 문자만 필터링하고,
map(String::valueOf) 코드로 각 문자를 문자열로 변환하고,
mapToInt(Integer::valueOf) 코드로 문자열을 정수로 변환하고,
sum()으로 합한다.

Leave a comment