코딩뿌시기(연습)
[Java] 자리수의 합으로 하샤드 수 판별하기
thisnorm
2025. 1. 15. 14:49
문제 설명
양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해 주세요.
제한 조건
- x는 1 이상, 10000 이하인 정수입니다.
입출력 예
x | return |
10 | true |
12 | true |
11 | false |
13 | false |
가장 먼저 생각한 순서는
- x의 자릿수의 합을 구해야 하니깐 x를 문자열로 변환하고 그 길이만큼 반복문을 반복한다.
- x의 문자열을 배열로 변환하여 변수 안에 배열 길이만큼 더해준다.
- x를 변수로 나눠보고 나눠 떨어지면 true를 반환 / 그렇지 않으면 false를 반환
이 순서대로 코딩을 해보자
처음에는 아래와 같이 코딩하였다.
class Solution {
public boolean solution(int x) {
boolean answer = true;
int sum = 0;
String str = String.valueOf(x);
char[] Array = toCharArray(x);
if ( 1 <= x && x <= 10000 ) {
for ( int i = 0; i < str.length(); i ++ ) {
sum += (int)Array[i];
}
if ( x % sum == 0 ) {
return answer;
}
else {
return false;
}
}
}
}
else문은 굳이 구현하지 않아도 된다.
여기서 문제는 (int) Array [ i ]였다.
Array [ i ]는 char 타입인데,
int로 강제 형변환을 시키면 아스키코드 값을 반환하는 것이었다.
그래서 수정한 완성 코드는 아래와 같다.
class Solution {
public boolean solution(int x) {
boolean answer = true;
int sum = 0;
String str = String.valueOf(x);
char[] Array = str.toCharArray();
if ( 1 <= x && x <= 10000 ) {
for ( int i = 0; i < str.length(); i ++ ) {
sum += Character.getNumericValue(Array[i]);
}
if ( x % sum == 0 ) {
return answer;
}
else {
return false;
}
}
else {
return false;
}
}
}
그리고 좋아요 수가 가장 많은 다른 사람의 코드도 확인해 보았다.
class Solution {
public boolean solution(int x) {
int sum = String.valueOf(x).chars().map(ch -> ch - '0').sum();
return x % sum == 0;
}
}
이렇게 짧게 할 수도 있었다...
복잡도를 비교해 보면
시간 복잡도는 동일하고 공간 복잡도에 있어서 더 효율적인 코드였다.