자리수 구하는 방법도 여러가지네 , 1번 방식으로 풀었는데
2가지 방식이 더있어서 2개 방식으로도 풀어봤다.
자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
N = 123 → 1 + 2 + 3 = 6
N = 987 → 9 + 8 + 7 = 24
제한사항
int → String 변환 후 각 문자를 순회하며 숫자로 변환
public int solution(int n) {
int answer = 0;
String strNum = String.valueOf(n);
for (char c : strNum.toCharArray()) {
answer += c - '0';
}
return answer;
}
split("") 대신 toCharArray() 사용 → 정규식 엔진 불필요Integer.valueOf() 대신 c - '0' 사용 → 박싱/언박싱 없음% 10으로 마지막 자릿수를 추출하고, / 10으로 자릿수를 제거하며 반복
123 % 10 = 3, 123 / 10 = 12 → answer = 3
12 % 10 = 2, 12 / 10 = 1 → answer = 5
1 % 10 = 1, 1 / 10 = 0 → answer = 6
0 → 종료
public int solution(int n) {
int answer = 0;
int reminder = n;
while (reminder > 0) {
answer += reminder % 10;
reminder = reminder / 10;
}
return answer;
}
reminder > 0 조건이 자연스럽게 종료 조건이 됨reminder % 10 == 0인 경우(ex. 10, 100)도 0을 더하므로 조건 분기 불필요Integer.valueOf() vs Integer.parseInt()| 메서드 | 반환 타입 | 특징 |
|---|---|---|
Integer.valueOf() | Integer (래퍼 클래스) | 박싱/언박싱 발생 |
Integer.parseInt() | int (기본형) | 불필요한 객체 생성 없음 ✅ |
단순 연산에서는 기본형을 반환하는 parseInt()가 적합하다.
char → int 변환 (아스키코드)'3' - '0' = 51 - 48 = 3
문자 숫자에서
'0'(아스키 48)을 빼면 해당 숫자의 정수값이 나온다.
Integer.parseInt(String.valueOf(c)) 보다 훨씬 가볍고 빠른 방식이다.
split("") vs toCharArray()| 방식 | 특징 |
|---|---|
split("") | 내부적으로 정규식 엔진 사용, String[] 객체 생성 |
toCharArray() | 단순 변환, char[] 생성 ✅ |
| 문자열 방식 | 수학 방식 | |
|---|---|---|
| 객체 생성 | String, char[] 생성 | 없음 |
| 메모리 | 자릿수만큼 추가 할당 | 변수만 사용 |
| GC 부담 | 있음 | 없음 |
| N이 클수록 | 상대적으로 불리 | 유리 ✅ |
String.valueOf() 내부적으로 String 객체와 char[]를 생성하고,
사용 후 GC 대상이 되는 반면, 수학 방식은 원시 타입 연산만 수행한다.
두 풀이 모두 정답이지만, N의 범위가 크거나 성능이 중요한 상황이라면 수학 방식이 더 유리하다.
단순하고 가독성이 중요한 상황이라면 문자열 방식도 충분히 좋은 선택이다.