본문 바로가기

개발/프로그래머스

하샤드 수

https://programmers.co.kr/learn/courses/30/lessons/12947

 

코딩테스트 연습 - 하샤드 수

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

programmers.co.kr

이번 문제는 한번에 풀지 못했는데, 간단한 문제였음에도 불구하고 단계를 적어보지 않고 바로 문제풀이에 들어가서 틀렸다. 간단한 문제라도 한번쯤 설계를 적어보고 개발하는 습관을 가져야겠다. 각자리의 숫자를 추출하려면 각 자리 단위로 나눠야 하는데, 매번 10으로 나누어서 문제가 풀리지 않았다.
기억할 메소드는 Math.log10(x), Math.pow(x,y)로
앞 메소드는 밑이 10인 로그를 씌우는 메소드, 
뒤 메소드는 x의 y제곱을 구하는 메소드.

// 내 코드
class Solution {
    public boolean solution(int x) {
            int init = x;// 입력받은 값
            int length = (int)(Math.log10(x)+1);// 입력받은 값의 자릿수
            System.out.println("length: "+length);
            int sum =0;
            for(int i=0; i<length-1; i++){// 4자리(1000)이면 3번해보기
                System.out.println("더하기 전의 sum: "+sum);
                sum+=x/Math.pow(10, length-1-i);//각 자릿수 추출
                System.out.println("더한 후의 sum: "+sum);
                x=(int)(x%Math.pow(10, length-1-i));// 자릿수 추출후 나머지값으로 변경
                System.out.println("입력값: "+x);
            }
            sum+=x;// 마지막의 값 더하기
            boolean answer = true;
            if(init%sum==0){
                return answer;
            }    
            else{
                answer = false;
            }
             return answer;
    }
}

 

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

추천을 많이 받은 코드의 특징은 입력받은 수를 문자열로 변환하여 각 자릿수를 따로따로 나누고, 다시 int로 변환해서 합을 구하는 방식을 취했다.
특이한 코드는 String[] temp = String.valueOf(num).split("");부분으로 이렇게 처리하면 각 인덱스마다 숫자, 한글, 영문자가 하나씩 들어간다.->원리를 확인해볼 것

'개발 > 프로그래머스' 카테고리의 다른 글

제일 작은 수 제거하기  (0) 2021.08.19
최대공약수, 최소공배수(유클리드호제법)  (0) 2021.08.19
콜라츠 추측  (0) 2021.08.16
x만큼 간격이 있는 n개의 숫자  (0) 2021.08.16
행렬의 덧셈  (0) 2021.08.16