하샤드 수_Java

컴투루·2022년 4월 25일
0

프로그래머스 Lv.1

목록 보기
5/38

연습문제

🔥 하샤드수 🔥


👀 문제

양의 정수 x가 하샤드 수 이려면 x의 자릿수의 합으로 x가 나누어져야한다.
자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수 solution을 완성하시오.


✔️ 조건

x는 1이상, 10000 이하인 정수


👩‍💻 입력 & 🧙 출력

arrreturn
10true
12true
11false
13false

🙋‍♀️ 풀이

class Solution {
    public boolean solution(int x) {
        int r = x;
        
        String n = Integer.toString(x);

        int y = n.length()-1 ; 

        int sum = 0;
        
       for(int i = y; y>0 ;y--){
            if(y==1){
                sum += (x/(10)) + x % ((y*10));
            }else{
                int z = (int)Math.pow(10,y);
                int j = x/z;
                sum += j;
                x = x - (z*j);
            }           
        }
       
      boolean answer = true;
       if(r%sum != 0){
            answer = false;
        }
        return answer;
    }
}

코드를 다음과 같이 작성하면 오류가 발생한다.

오류가 발생하는 이유는 정수를 0으로 나눴기 때문이었다.

int y = n.length()-1 ; 

y의 값을 대입하는 부분을 보자.
n의 길이 즉 x의 자릿수에서 1을 뺀 값을 대입하고 있다.
그렇다면 만약에 x에 한자리 숫자가 들어온다면 y의 값은 0이 되고 반복문을 뛰어넘어서 sum이 0인 상태에서 정수 r을 나눈다.
이부분이 문제였던것!

왜한건지... 알수가 없는 부분이다. 저것때문에 한시간을 보고 있었다.

class Solution {
    public boolean solution(int x) {
        int r = x;
        
        String n = Integer.toString(x);

        int y = n.length(); 

        int sum = 0;
        
       for(int i = y; y>0 ;y--){
            if(y==1){
                sum += x/10 + x %10;
            }else{
                int z = (int)Math.pow(10,y);
                int j = x/z;
                sum += j;
                x = x - (z*j);
            }           
        }
       
      boolean answer = true;
       if(r%sum != 0){
            answer = false;
        }
        return answer;
    }
}

빼고 나니까 성공...


💬 다른 풀이

  1. 배열과 split 이용하기
class Solution{
    public boolean solution(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;
    }
    }
}

너무 간단한 풀이다.

1) String형의 배열temp에 num을 String 형으로 변환후 split한 값을 대입
2) temp를 돌면서 하나씩 Integer형으로 변환하면서 sum에 저장
3) num을 sum으로 나눈 나머지의 값으로 true와 false 각각 return

  1. 완전 간단한 풀이
class Solution{
	public boolean solution(int x){
    	int num = x;
        int sum = 0;
        
        while(num != 0){
        	sum += num %10;
            num /= 10;
        }
        return x%sum == 0? true : false;
    }
}

나는 아래의 풀이가 더 마음에 든다.
반복문에 조건문을 엄청 써놓은 내코드와 다르게 봤을때 이해가 쉽게 되고 너무 간단해서 좋다.


👏 마무리

실행만되는게 아니라 보기좋은 코드를 만들어보자💪

profile
맘 먹으면 못할 게 없지

0개의 댓글