본문 바로가기

자바

하샤드수

반응형
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package javaalgorithm;
 
public class HarshadNumber{
    public boolean isHarshad(int num){
        int sumHarshad = 0;
        int tempNum = num;
 
        while(num>=1){
            sumHarshad += num%10;
            num /= 10;
        }
        
        if(tempNum % sumHarshad == 0)
            return true;
        else
            return false;
    }
  
       // 아래는 테스트로 출력해 보기 위한 코드입니다.
    public static void  main(String[] args){
        HarshadNumber sn = new HarshadNumber();
        System.out.println(sn.isHarshad(18));
    }
}
 
cs

문제를 보면

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

이 문제를 풀었을 당시에는 홈페이지가 달라서 지금 solution함수에 작성하는 것과는 조금 다르다.

그래서 지금의 새로운 홈페이지에 맞게 작성을 하면 이렇다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
  public boolean solution(int x) {
      int sumHarshad = 0;
        int tempNum = x;
 
        while(x>=1){
            sumHarshad += x%10;
            x /= 10;
        }
        
        if(tempNum % sumHarshad == 0)
            return true;
        else
            return false;
  }
}
cs

class만 Solution으로 바꾸고 main함수를 없애주면 된다. 기본 함수에 쓰여진 것은 같기 때문에 안에 내용만 그대로 가져와서 실행하면 된다.


하샤드 수란 각 자리에 해당하는 숫자를 더한 값이 원래 값을 나눴을 때 나누어 떨어지는 수를 말한다. 이 부분을 풀기 위해서 sumHarshad라는 변수를 만들고 각 자리수를 이 변수에 더해서 넣는다. 그 부분이 while로 시작하는 반복문이다.  인자값으로 받은 변수 x를 1보다 크거나 같을 때 sumHarshad에 10으로 나눈 나머지 값을 넣는다. 이렇게 해주는 이유는 x % 10를 실행하면 1의 자리 숫자가 나오기 때문이다. 그 이후에 x의 값을 x를 10으로 나누어 준 값으로 바꿔준다. 

이것을 하는 이유를 예를 들어서 설명하면 18이란 숫자가 있으면 처음에 x % 10을 하면 8이 나온다. 이후 십의 자리 숫자인 1을 얻기 위해서 18을 10으로 나눠준다. 이렇게 하면 몫이 1이 나오기 때문에 x값이 처음에 십의 자리였던 1로 바뀌어 들어가게 되는 것이다.


이 과정을 모두 거친 후 인자 값으로 받은 x값과 자릿수 합을 비교해 주어야 하는데 이때 x값과 비교를 하면 안된다. 그 이유는 지금 sumHarshad를 구하기 위해서 x는 10으로 계속 나눠준 값이기 때문이다. 그래서 tempNum에 x값을 미리 넣어두고 이 값과 sumHarshad를 비교해주는 것이다.

이렇게해서 나눠지면 true를 반환하고 아니면 false를 반환하면 이 문제가 풀리게 된다.



'자바' 카테고리의 다른 글

2016년의 요일 출력  (0) 2016.11.19
최솟값 만들기  (0) 2016.11.19
약수의 합  (0) 2016.11.19
피보나치 수  (0) 2016.11.19
행렬의 덧셈  (0) 2016.11.19