ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] 프로그래머스 하샤드 수 구하기
    Algorithm 2022. 1. 29. 12:36
    • 하샤 드 수
    문제 설명

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

    제한 조건
    • x는 1 이상, 10000 이하인 정수입니다.
    입출력 예arrreturn
    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은 하샤드 수가 아닙니다.

    public class 하샤드수 {
        public static void main(String[] args) {
            int x = 13;
    
            System.out.println(solution(x));
        }
    
        public static boolean solution(int x){
            boolean answer = true;
    
            String result = x + "";
            char[] chars = result.toCharArray();
            int sum = 0;
    
    
            //(int)이런식으로 강제캐스팅하면은 int로 변환 되는게 아니라 아스키코드로 변환되서 나옴.
            //1은 아스키코드로 41 3은 아스키코드로 51
            //그래서 Character.getNumericalValue라는 메소드롤 통해서 char를 int로 형 변환
    
            for (char aChar : chars) {
                sum += Character.getNumericValue(aChar);
            }
            if(x % sum == 0){
                answer = true;
            } else {
                answer = false;
            }
    
            return answer;
        }
    }

    지난 포스팅에서는 프로그래머스 1단계 완주하지 못한 선수 문제를 풀어봤는데요 이번 포스팅에서는 하샤드 수 구하기 문제를 해결해보겠습니다.  문제 설명만 봐도 그렇게 어렵지 않은 문제임을 알 수 있는데요 저는 이런 알고리즘 문제들을 처음 접해보기 때문에 lv1문제를 먼저 다 풀고 lv2로 넘어갈 생각입니다.

     

    우선 지난번과 같이 main 메소드에다가 임의 데이터를 넣어서 테스팅을 했습니다!!

    그리고 같은 클래스 내에 static 메서드를 하나 더 만들어서 로직을 구현했습니다.

     

    문제의 요점은 위에서 설명되어있는 것처럼 10,000 이하의 x라는 숫자가 주어질 경우 각 자릿수의 숫자를 모두 더하고,

    x가 각 자릿수의 숫자를 합한 결과로 나누어 떨어지면 하샤드 수라는 것입니다.

     

    여기서 중요한 것은

    x라는 숫자가 주어졌을 때 각 자릿수의 숫자를 더하는 방법을 찾는 것이라고 할 수 있습니다.

    위의 코드를 보면 parameter로 받아온 x라는 숫자를 String으로 타입 변환을 해줍니다.

    그러고 나서 toCharArray라는 메서드를 통해서 문자열을 한자리 씩 잘라서 char형태로 타입 변환을 하고 배열에 담을수가 있는데요

    이제 각 index에 담긴 숫자들을 다 더해주기만 하면 됩니다!!!

     

    향상된 for문을 사용해서 배열에 담긴 char타입의 데이터를 하나씩 꺼내와서

    Character.getNumericalValue()라는 메서드를 통해서 int로 타입변환을 해주고

    위에 선언된 int타입의 sum이라는 변수에 계속해서 더해줍니다.

     

    저도 Googling을 통해서 저런 메소드를 알게 되었는데요,

    만약 char타입의 데이터를 (int) aChar 이런 식으로 강제 캐스팅을 하게 되면 배열에 담겨있는 숫자가 나오지 않습니다.

    System.out.println을 사용해서 테스트를 해본 결과 1은 49로 나오고 3은 51로 나왔습니다.

     

    이것은 ['1', '2']이라는 char배열에 담긴 데이터들을 강제 캐스팅하면 아스키코드가 나온다는 것을 알 수 있습니다.

    즉, 1이라는 모양의 문자는 십진법으로 49라는 숫자를 가지고 있는 데이터입니다.

     

    그래서 Character 클래스의 getNumericValue라는 메서드를 사용했습니다.

     

     문자 한 개 한 개를 보통 character라고 표현합니다. intelli j에서 제공하는 character 클래스 설명을 보면

    원시 타입인 char를 object 형태로 감싸는 wrapper 클래스라고 되어있습니다.

    예를 들어서, int의 wrapper 클래스는 Integer, long의 wrapper class는 Long처럼 char 또한 character라는 wrapper 클래스를 가지고 있는 것이죠.

    그 외에도 대문자를 소문자로 바꿔주거나 소문자를 대문자로 바꿔주는 여러 메서드를 지원한다고 합니다.

     

    아무튼 Character클래스의 getNumericValue 메소드를 통해서 int로 형 변환을 할 수 있습니다.

     

    이렇게 sum이라는 변수에 각 자리의 숫자를 다 더하고 나서 처음 주어진 x라는 숫자를 sum으로 나누었을 때 나머지가

    0이라면은 하샤 다수이기 때문에 answer = true 그렇지 않다면 answer = false로 했습니다.

     

     

Designed by Tistory.