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를 반환하면 이 문제가 풀리게 된다.