코딩뿌시기(연습)

[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

 


 

 

 

가장 먼저 생각한 순서는

  1. x의 자릿수의 합을 구해야 하니깐 x를 문자열로 변환하고 그 길이만큼 반복문을 반복한다.
  2. x의 문자열을 배열로 변환하여 변수 안에 배열 길이만큼 더해준다.
  3. 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;
    }
}

 

이렇게 짧게 할 수도 있었다...

 

복잡도를 비교해 보면

시간 복잡도는 동일하고 공간 복잡도에 있어서 더 효율적인 코드였다.