Android/Algorithm

[프로그래머스 / Kotlin] 하샤드 수

정생강 2024. 3. 5. 20:46

문제 설명

 

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

- x는 1 이상, 10000 이하인 정수 입니다.

 

풀이 과정

문제를 읽자마자 아 각 자리를 더한 후 더한 값으로 입력받은 x를 나누어 보면 되겠구나. 라고 생각했다. 나누었을 때 나머지가 0이라면 true 아니면 false를 반환하면 된다고 생각하였다. 하지만 이번 문제를 풀면서 2번의 오류를 겪었다.

 

첫째로 제한조건을 보지 않고 예시만 보고 입력 받은 수가 2자리수라고 단정한 것이다.

 

//첫번째 실수
class Solution{
	fun solution(x:Int): Boolean{
    	return (x % (x/10 + x%10) == 0) true else false
    }
}

 

이 코드가 첫번째로 푼 코드인데 예제는 통과했지만 제출 전 테스트에서 실패를 겪어 다시 보니 제한 조건을 보지 않았단 걸 알아챘다. (바보 같은 실수...)

 

입력 받는 수가 여러 자리 수라면 반복문을 이용해 각 자리 수를 더하고 더한 값으로 더한 값으로 나누어 떨어지는 지 판단하는 if 문을 사용해야겠다고 생각했다. 

//두번째 실수
class Solution {
    fun solution(x: Int): Boolean {
        var sum = 0
        var a = x
        while(a == 0){
            sum += a % 10
            a / 10
        }
        
        return if(x % sum == 0) true // 에러 발생
            else false
    }
}

 

여기서 두번째 문제를 만났다.

이 코드를 실행 시켰더니  Exception in thread "main" java.lang.ArithmeticException: / by zero 해당 에러를 마주쳤다.

이 에러는 if문의 조건식에서 발생한 문제인데 sum을 0이라고 입력해 둔 상태에서 x를 나누었더니 변수를 0으로 나눌 수 없다는 에러가 뜬 것이다.

 그렇다. 난 바보였다. while문에 조건식을 잘못썼다... 

생각해보니 마지막 if문도 필요 없이 식만 넣어주면 될 것 같다.

 

내가 푼 코드

class Solution {
    fun solution(x: Int): Boolean {
        var sum = 0
        var a = x
        while(a != 0){
            sum += a % 10
            a /= 10
        }
        return x % sum == 0
    }
}

 

후기

 

문제 뿐만 아니라 제한조건까지 꼼꼼히 읽고 풀어야 한다는걸 다시 느꼈다.

조건문 또한 다시 한번 살펴보기..! 쉬운 문제라고 방심하지 않기.

다음에 이 문제를 map을 사용해서 다시 풀어보아야 겠다.