Coding Test/Others

[Algorithm] 하샤드 수

byunghyun23 2020. 8. 16. 20:03

'하샤드 수' 정의는 다음과 같다.

 

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.제한 조건

  • x는 1 이상, 10000 이하인 정수입니다.

입출력 예

arr return
10 true
12 true
11 false
13 false

입출력 예 설명

입출력 예 #1
10의 모든 자릿수의 합은 1입니다. 10은 1로 나누어 떨어지므로 10은 하샤드 수입니다.

입출력 예 #2
12의 모든 자릿수의 합은 3입니다. 12는 3으로 나누어 떨어지므로 12는 하샤드 수입니다.

입출력 예 #3
11의 모든 자릿수의 합은 2입니다. 11은 2로 나누어 떨어지지 않으므로 11는 하샤드 수가 아닙니다.

입출력 예 #4
13의 모든 자릿수의 합은 4입니다. 13은 4로 나누어 떨어지지 않으므로 13은 하샤드 수가 아닙니다.

 

 

위 문제는 입력 받은 정수값의 자릿수의 합을 구하면 풀어낼 수 있다.

다음과 같이 코드를 작성했다.

class Solution {
    public boolean solution(int x) {
        boolean answer = false;
        
        String strX = Integer.toString(x);
        int sumDigit = 0;
        
        int length = strX.length();
        for (int i = 0; i < length; i++) {
        	sumDigit += strX.charAt(i) - '0';
        }
        
        if ((x % sumDigit) == 0) {
            answer = true;
        }
        
        return answer;
    }
}

입력 받은 정수값을 스트링으로 변환하여 저장하고, 스트링 각 원소 값에 '0'을 빼 자릿수 합을 구했다.

'0'을 빼는 것은 아스키 코드를 참조하면 알 수 있다.

 

아스키 코드 (네이버 나무위키)

String.chatAt(index) 메소드는 스트링에서 index에 해당하는 값을 char형으로 반환한다.

만일 첫 번째 index에 해당하는 값이 '7'일 경우, 10진수 값은 55다.

'7' - '0'의 값은 10진수로 55 - 48 = 7이 된다. 결국, 문자가 숫자일 경우에 '0'을 빼주면 해당하는 정수값을 얻을 수 있다.

 

Feedback

1.  x % sum == 0을 조건문을 이용해 검사하고 값을 answer에 담고나서 반환해야 하는가?

 

2. 스트링보다는 정수만을 이용해 처리해 보는것은 어떨지?

 

 

피드백을 반영하여 다음과 같이 새로 작성했다.

class Solution {
    public boolean solution(int x) {
        int temp = x;
        int sum = 0;

        while(temp > 0){
            sum += temp % 10;
            temp /= 10;
        }
        
        return x % sum == 0;
    }
}

1.  x % sum == 0을 조건문을 이용해 검사하고 값을 answer에 담고나서 반환해야 하는가?

x % sum == 0 자체가 boolean 값을 반환하기 때문에 return에 직접 작성해준다.

 

2. 스트링보다는 정수만을 이용해 처리해 보는것은 어떨지?

입력된 값이 9288라고 가정해보자.

sum += temp % 10;

= 입력된 값에 최하위 자릿수 값을 구한다. (몫은 928, 나머지는 8이기 때문에 sum에는 8이 더해진다.)

 

temp /= 10;

= 최하위 자릿수를 제외한다. (temp에는 928이 저장된다.)

 

temp의 값이 0보다 크면 위 로직을 반복한다. 그러면 다음과 루프 횟수별로 같은 값을 얻을 수 있다.

1 : 8

2 : 8

3 : 2

4 : 9

 

최종적으로 sum의 값은 27이 되며 9288은 27로 나누어 떨어져 true를 반환하게 된다.

'Coding Test > Others' 카테고리의 다른 글

[Algorithm] 소수 만들기  (0) 2020.11.10
[Algorithm] 영어 끝말잇기  (1) 2020.10.15
[Algorithm] 수포자  (0) 2020.10.14
[Algorithm] 방문 길이  (0) 2020.10.14
[Algorithm] 다음 큰 숫자  (0) 2020.08.24