문제 설명
한 자리 정수로 이루어진 문자열 num_str
이 주어질 때, 각 자리수의 합을 return하도록 solution 함수를 완성해주세요.
제한사항
3 <= num_str
<= 100
입출력 예
num_str | result |
---|---|
"123456789" | 45 |
"1000000" | 1 |
입출력 예 설명
입출력 예 #1
- 문자열 안의 모든 숫자를 더하면 45가 됩니다.
입출력 예 #2
- 문자열 안의 모든 숫자를 더하면 1이 됩니다.
위 문제는 말 그대로 문자열 숫자의 각 자리수의 합을 구하는 문제이다.
문자열 123456789를 입력하면 각 자리수의 합, 즉 1+2+3+4+5+6+7+8+9의 값은 45가 된다.
나는 이 문제를 굉장히 어렵게 접근했다. 우선 코드부터 작성해보자면
class Solution {
public int solution(String num_str) {
int answer = 0;
int[] arr = new int[num_str.length()];
// 배열로 변환
for (int i = 0; i < num_str.length(); i++) {
arr[i] = num_str.charAt(i) - '0';
}
// 배열의 합
for (int i = 0; i < arr.length; i++) {
answer += arr[i];
}
System.out.println(answer);
return answer;
}
}
이렇게 작성하였다.
String으로 전달받은 num_str
을 int형 배열로 변환한다음, 각 배열의 합을 구하는 식으로 접근하였다.
하지만 이보다 훨씬 효율적인 코드가 물론 존재했다.
class Solution {
public int solution(String num_str) {
return num_str.chars().map(ch -> ch - 48).sum();
}
}
그 코드는 매우 간결하였다.
우선 num_str
을 전달받고, chars()
메서드를 이용해서 문자열을 Stream 형태로 변환한다.
이 경우, 문자열의 각 문자(문자열에서의 각 자릿수)가 아스키코드 값으로 변환된다.
그리고 map
은 스트림의 각 요소를 변환하는 역할을 한다.ch - 48
은 각 문자 코드값을 숫자로 변환한다.
'0'의 ASCII 값은 48이므로, '1'의 ASCII 값(49)에서 48을 빼면 1이 된다.
마지막으로 .sun()
을 이용해서 변환된 숫자 스트림의 값을 모두 더한다.
최종적으로 모든 자릿수의 합을 반환한다.
내가 맨 처음 문제를 어렵게 접근한 이유는 String이 배열의 역할을 한다는 것을 잘 인지를 하지 못하고 있었다. 그래서 한 번 더 배열로 변환하는 과정이 들어가있었던 것이다.
'problem solving' 카테고리의 다른 글
[프로그래머스] 대문자와 소문자 (0) | 2024.11.28 |
---|---|
[프로그래머스] 두 수의 연산값 비교하기 (0) | 2024.11.27 |
[프로그래머스] 가위 바위 보 (0) | 2024.11.26 |
[프로그래머스] 배열 비교하기 (0) | 2024.11.26 |
[프로그래머스] 뒤에서 5등까지 (0) | 2024.11.21 |