Level2 하샤드수

문제

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다.


Harshad함수는 양의 정수 n을 매개변수로 입력받습니다. 이 n이 하샤드수인지 아닌지 판단하는 함수를 완성하세요.
예를들어 n이 10, 12, 18이면 True를 리턴 11, 13이면 False를 리턴하면 됩니다.

정수를 받아서 자릿수를 더해야 되기 때문에 일단 문자열로 변환한 후에 split() 메소드를 사용해서 하나씩 나눈다음에 더했다.

그 이후에는 그 자릿수를 더한 수를 가지고 본래 넘어온 수를 나눠서 나누어 떨어지면 true 아니면 false를 반환하게 함!

그런데 변수명이나 이런거 어떻게 하면 잘 지을 수 있을까.. 내 코드에 항상 불만이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class HarshadNumber{
public boolean isHarshad(int num){

String convertStr = String.valueOf(num);
String[] strArr = convertStr.split("");

int cipher = 0;

for (int i=0; i<strArr.length; i++) {
cipher += Integer.parseInt(strArr[i]);
}

return num % cipher == 0 ? true : false;
}

// 아래는 테스트로 출력해 보기 위한 코드입니다.
public static void main(String[] args){
HarshadNumber sn = new HarshadNumber();
System.out.println(sn.isHarshad(18));
}
}

다른 사람의 풀이

나랑 거의 똑같은 풀이 -> valueOf() 메소드가 String을 반환하기 때문에 바로 split() 메소드를 사용할 수 있다.

그리고 배열이나 리스트를 반복할 때는 자바의 향상된 for문을 사용하는게 좋다고 했다. 음 전체를 다 돌리는 거면 향상된 for문이 좋고, 제한된 숫자 만큼 반복을 돌리려면 기존에 for문을 돌리는게 낫다고 내가 속해있는 스터디의 스터디장님이 말씀한게 생각난다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class HarshadNumber{
public boolean isHarshad(int num){

String[] temp = String.valueOf(num).split("");

int sum = 0;
for (String s : temp) {
sum += Integer.parseInt(s);
}

if (num % sum == 0) {
return true;
} else {
return false;
}
}

// 아래는 테스트로 출력해 보기 위한 코드입니다.
public static void main(String[] args){
HarshadNumber sn = new HarshadNumber();
System.out.println(sn.isHarshad(18));
}
}

다른 사람의 풀이

Java8을 활용한 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.function.IntConsumer;

public class HarshadNumber{
private int sum = 0;
public boolean isHarshad(int num){
sum = 0;
Integer.toString(num).chars().forEach(c -> sum += c - '0');
return num % sum == 0;
}

// 아래는 테스트로 출력해 보기 위한 코드입니다.
public static void main(String[] args){
HarshadNumber sn = new HarshadNumber();
System.out.println(sn.isHarshad(18));
}
}
Share