[Java] 자바 알고리즘, 프로그래머스 알고리즘 문제풀이 "하샤드 수"

하샤드 수


문제 설명

양의 정수 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은 하샤드 수가 아닙니다.


나의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
  public boolean solution(int x) {
      boolean answer = false;
      String strx = x+"";
      char[] charx = strx.toCharArray();
      int sum =0;
      for(int i =0; i<charx.length; i++){
          sum+= Integer.parseInt(charx[i]+"");
      }
      System.out.println(sum);
      if(x%sum==0){
          answer = true;
      }
      return answer;
  }
}
cs


- x를 각각의 자리수로 쪼개야 합니다. 쪼개는 방법은 다양하지만 

1. 문자열로 만들어서 length 만큼 각각 자르는 방법,

2. 숫자로 처리하고 싶으면 10의 배수로 나머지를 취해서 얻어내는 방법

3. 문자열로 만들고 char배열로 만들어서 각각의 char 데이터로 얻어낸 후 String으로 변환하여 처리하는 방법


저는 3번방법을 이용했습니다. char배열로 만드는 toCharArray메소드가 있었고, 자주 이용하는 손쉬운 방법을 이용하게 되네요...ㅎㅎ char 배열을 만들면 이에 +"" 공백을 더해서 문자열로 만듭니다.(이는 자바만의 방법) 이를 다시 parseInt로 숫자로만들고 더한다음 매개변수 x와 나머지연산을 해주면 됩니다. 나머지가 있다면 배수가 아니므로 초기화값인 false가 담길것이고 if문에 만족하면 true가 담겨서 반환됩니다.


다른사람의 풀이


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));
    }
}
cs


- 이분은 제가 말한 방법중 1번을 선택하셨네용. length 만큼 자른건아니지만 split 메소드를 이용해서 처리하였습니다. split(문자열, 공백"")이면 문자열 하나하나씩 쪼개지거든요(띄어쓰기 포함) 그렇게해서 받은 문자를 -> int로 타입변환해서 처리하신것 같습니다. 


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));
    }
}
cs


- 람다식과 stream을 이용해서 처리하셨는데요. 람다와 스트림을 모르시는 분들을 위해 저 forEach 괄호안에있는 c는 앞서 Integer.toString(num)으로 나온 Integer 값을 char형으로 쪼갠겁니다. 이들을 쪼개고 각 요소에 접근할때(잘려진 char형 조각들) 접근하는 변수로 c로 잡은거구요. 나머지 알고리즘은 저와 비슷합니다. 더해서 기존의 숫자와 나눠서 떨어지면 참 아니면 false . 스트림을 이용한 방법입니다. 저는 아직 스트림이 어느 문제에서 적용해야할지 말아야할지 잘 모르겠는데 이분은 왠지 고수의 냄새가 느껴집니다.. 


댓글

Designed by JB FACTORY