어떤 숫자의 모든 자릿수가 그 숫자를 나눌 수 있는지 확인하는 것은 코딩 테스트와 알고리즘 학습에서 자주 등장하는 문제입니다. 예를 들어 128은 각 자릿수인 1, 2, 8이 모두 128을 나눌 수 있으므로 조건을 만족하지만, 150은 자릿수 중에 0이 포함되어 있어 나눗셈 자체가 불가능합니다. 아래는 이를 확인하는 Java 코드입니다.
예제 코드
import java.io.*;
public class Demo{
static boolean divisibility_check(int val, int digit){
return (digit != 0 && val % digit == 0);
}
static boolean divide_digits(int val){
int temp = val;
while (temp > 0){
int digit = temp % 10;
if ((divisibility_check(val, digit)) == false)
return false;
temp /= 10;
}
return true;
}
public static void main(String args[]){
int val = 150;
if (divide_digits(val))
System.out.println("숫자의 모든 자릿수가 해당 숫자를 완전히 나눕니다.");
else
System.out.println("숫자의 모든 자릿수가 해당 숫자를 완전히 나누지는 못합니다.");
}
}
출력 결과
숫자의 모든 자릿수가 해당 숫자를 완전히 나누지는 못합니다.
코드 동작 원리
divisibility_check 함수는 대상 숫자(val)와 자릿수(digit) 두 개의 매개변수를 받습니다. 자릿수가 0이 아니면서 숫자를 해당 자릿수로 나눴을 때 나머지가 0이면 true를 반환하고, 그렇지 않으면 false를 반환합니다. 자릿수가 0인 상태로 나눗셈을 수행하면 ArithmeticException이 발생할 수 있으므로, 반드시 0 여부를 먼저 검사해야 합니다.
divide_digits 함수는 대상 숫자를 매개변수로 받아 각 자릿수를 하나씩 추출하며 검사하는 Boolean 함수입니다. 임시 변수 temp에 숫자를 복사한 후, while 루프 안에서 10으로 나눈 나머지를 이용해 마지막 자릿수를 구하고 divisibility_check 함수로 해당 자릿수가 숫자를 나눌 수 있는지 확인합니다. 나눌 수 없는 자릿수가 하나라도 발견되면 즉시 false를 반환하고, 모든 자릿수가 검사를 통과하면 true를 반환합니다.
main 함수에서는 검사할 숫자 값(150)을 정의한 뒤 divide_digits 함수를 호출합니다. 반환값이 true이면 모든 자릿수가 숫자를 나눈다는 메시지를 출력하고, false이면 완전히 나눌 수 없다는 메시지를 출력합니다.
참고 사항
이 방식의 시간 복잡도는 숫자의 자릿수에 비례하므로 O(log N)입니다. 또한 음수나 0과 같은 특수한 입력값에 대한 예외 처리를 추가하면 더욱 견고한 코드를 작성할 수 있습니다.