문제 설명
양의 정수 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을 사용해서 다시 풀어보아야 겠다.
'Android > Algorithm' 카테고리의 다른 글
[프로그래머스 / Kotlin] 콜라츠 추측 (0) | 2024.03.06 |
---|---|
[프로그래머스 / kotlin] 두 정수 사이의 합 (0) | 2024.03.06 |
[프로그래머스 / Kotlin] 시저 암호 (1) | 2024.02.29 |
[프로그래머스/Kotlin] 최소 직사각형 (0) | 2024.02.28 |
[kotlin] 크기가 작은 부분 문자열 (0) | 2024.02.26 |