주어진 숫자 n이 있을 때, 그 숫자의 각 자릿수를 모두 더한 값으로 n을 나눌 수 있는지 확인해야 합니다. 이를 확인하려면 일의 자리부터 시작하여 모든 자릿수를 더한 후, 그 최종 합으로 원래 숫자를 나누면 됩니다.
예를 들어 숫자 "521"이 있다고 가정해 보겠습니다. 이 숫자의 자릿수 합은 "5 + 2 + 1 = 8"이지만, 521을 8로 나누면 나머지가 남기 때문에 나누어 떨어지지 않습니다.
반면 또 다른 예인 "60"의 경우 "6 + 0 = 6"이 되며, 60은 6으로 나누었을 때 나머지 없이 완전히 나누어 떨어집니다.
예시
입력: 55 출력: No 설명: 5+5 = 10; 55는 10으로 나누어 떨어지지 않음 입력: 12 출력: Yes 설명: 1+2 = 3; 12는 3으로 나누어 떨어짐
문제 해결 접근 방식
이 문제를 해결하려면 입력값에서 각 자릿수를 하나씩 추출하여 모든 자릿수의 합을 구한 다음, 그 합이 원래 숫자를 나눌 수 있는지 확인해야 합니다.
- 숫자를 입력받습니다.
- 일의 자리부터 각 자릿수를 추출하여, 초기값이 0으로 설정된 합계 변수에 더합니다.
- 입력받은 숫자를 자릿수의 합으로 나눕니다.
- 결과를 반환합니다.
알고리즘
함수 int isDivisible(long int num)
단계 1 -> temp = num, sum = 0으로 선언 및 초기화
단계 2 -> While num 반복
k = num % 10으로 선언 및 초기화
sum = sum + k로 설정
num = num / 10으로 설정
반복 종료
단계 3 -> 만약 temp % sum == 0이라면,
1 반환
단계 4 -> 0 반환
함수 종료
main() 함수에서
단계 1 -> num = 55로 선언 및 초기화
단계 2 -> 만약 isDivisible(num)이라면,
"yes" 출력
단계 3 -> 아니라면
"no" 출력C 코드 구현
#include <stdio.h>
// 이 함수는 주어진 숫자가
// 자릿수의 합으로 나누어 떨어지는지 확인합니다.
int isDivisible(long int num) {
long int temp = num;
// 자릿수의 합 구하기
int sum = 0;
while (num) {
int k = num % 10;
sum = sum + k;
num = num / 10;
}
// 자릿수의 합이 num을 나눌 수 있는지 확인
if (temp % sum == 0)
return 1;
return 0;
}
int main() {
long int num = 55;
if(isDivisible(num))
printf("yes\n");
else
printf("no\n");
return 0;
}실행 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
No
코드 설명
위 코드의 동작 원리를 살펴보겠습니다.
- isDivisible 함수: 먼저 원래 숫자를
temp변수에 백업해 둡니다. 그다음while루프를 사용하여num % 10으로 마지막 자릿수를 추출하고, 이를sum에 누적합니다. 이후num / 10으로 이미 처리한 자릿수를 제거하는 과정을 반복합니다. - 나눗셈 검증: 모든 자릿수의 합을 구한 후, 백업해 둔
temp를sum으로 나누어 나머지가 0인지 확인합니다. 나머지가 0이면 1(참), 그렇지 않으면 0(거짓)을 반환합니다. - main 함수: 테스트할 숫자(55)를 준비하고, 함수의 반환값에 따라 "yes" 또는 "no"를 출력합니다.
55의 경우 자릿수의 합이 5 + 5 = 10이지만, 55 ÷ 10 = 5.5로 나누어 떨어지지 않으므로 결과는 "No"입니다. 만약 입력값을 12나 60처럼 자릿수의 합으로 정확히 나누어 떨어지는 숫자로 바꾸면 "Yes"가 출력됩니다.