문제
https://school.programmers.co.kr/learn/courses/30/lessons/12931
나의 풀이
각 자릿수는 10씩 나눈 나머지로 구할 수 있다.
%와 /연산자를 사용해 각 자릿수를 누적하고 나머지를 구한다.
나머지가 0보다 작아질 때까지 (일의 자리까지 구할 때까지) 이 과정을 반복한다.
1. 나의 코드
import java.util.*;
public class Solution {
public int solution(int n) {
int answer = 0;
while(n>0) {
answer += n % 10;
n /= 10;
}
return answer;
}
}
입력된 숫자의 자릿수에 비례하여 반복의 횟수가 많아진다.
자바에서 int형의 최대값은 `2,147,483,647` 이므로 최소 1회에서 최대 10번의 반복의 시행된다.
다른 풀이
2. n을 String으로 변환해서 split()
n을 String으로 변환해서, 각 자리수를 얻는 것도 신기했다.
String으로 변환해서 계산하면 장점이 뭘까?
-> 가독성이 좋다고 한다. 아마도 각 자리를 분리한다는 개념이 잘 드러나기 때문인 것 같다.
그치만,, 내가 보기엔 10씩 나눈 코드가 더 한 눈에 들어오는 것 같다..
import java.util.*;
public class Solution {
public int solution(int n) {
int answer = 0;
String[] array = String.valueOf(n).split("");
for(String s : array){
answer += Integer.parseInt(s);
}
return answer;
}
}
먼저 입력된 숫자를 문자열로 변환한 후, 각 자리 수를 문자열 배열로 분할한다.
이 과정에서 숫자의 자릿수에 따라 문자열로 변환이 이루어진다.
문자열의 길이가 입력된 숫자의 자릿수와 일치하게 된다.
따라서 입력된 숫자의 자릿수가 증가할수록 문자열 변환에 필요한 시간 및 메모리가 선형적으로 증가한다.
이후 문자열 배열의 각 요소를 다시 정수로 변환하는 과정에서도 마찬가지로 입력된 숫자의 자릿수에 비례하여 연산이 수행된다.
이 코드에서는 문자열 변환과 관련된 오버헤드가 방생하며, 입력된 숫자의 자릿수가 증가할수록 성능 저하를 야기할 수 있다.
3. Char 배열로 변환해서 아스키 코드로 계산
이건 정말 숫자의 나열의 각 자릿수를 계산한다는 코드의 목적을 한눈에 볼 수 있고 (가독성 굳)
char 를 아스키코드로 바로 계산하기 때문에 int로 바로 계산할 수 있다는 점도 좋다.
문자열 대신 char 배열을 사용하여 각 자리 수를 처리하므로, 2번 코드와 비교해서 문자열 연산에 따른 오버헤드를 줄일 수 있다.
import java.util.*;
public class Solution {
public int solution(int n) {
int answer = 0;
char[] arr = Integer.toString(n).toCharArray();
for(int i = 0; i < arr.length; i++){
answer += arr[i] - 48;
}
return answer;
}
}