사용자가 하나의 숫자를 입력하면, 프로그램은 해당 숫자를 개별 자릿수로 분리한 후 각 자릿수를 모두 곱한 결과를 출력합니다. 이번 글에서는 for 루프와 while 루프 두 가지 방법으로 자릿수의 곱(product of digits)을 구하는 방법을 알아보겠습니다.
핵심 로직 이해하기
자릿수의 곱을 구하는 핵심 아이디어는 다음과 같습니다.
- 숫자를 10으로 나눈 나머지(% 연산)를 사용해 마지막 자릿수를 추출합니다.
- 추출한 자릿수를 누적 변수에 곱합니다.
- 숫자를 10으로 나누어(정수 나눗셈) 마지막 자릿수를 제거합니다.
- 숫자가 0이 될 때까지 위 과정을 반복합니다.
for 루프를 사용한 로직은 다음과 같습니다.
for(product = 1; num > 0; num = num / 10){
rem = num % 10;
product = product * rem;
}여기서 주목할 점은 초기화 부분에서 product를 1로 설정한다는 것입니다. 곱셈의 항등원이 1이기 때문입니다. 만약 0으로 초기화하면 어떤 값을 곱하더라도 결과는 항상 0이 되어버립니다.
예제 1: for 루프 사용
다음은 for 루프를 사용하여 입력받은 숫자의 자릿수 곱을 계산하는 C 프로그램입니다.
#include <stdio.h>
int main(){
int num, rem, product;
printf("enter the number : ");
scanf("%d", &num);
for(product = 1; num > 0; num = num / 10){
rem = num % 10;
product = product * rem;
}
printf(" result = %d", product);
return 0;
}실행 결과
위 프로그램을 실행하면 다음과 같은 결과를 얻을 수 있습니다.
enter the number: 269 result = 108 enter the number: 12345 result = 120
예를 들어 269를 입력하면 2 × 6 × 9 = 108이 되고, 12345를 입력하면 1 × 2 × 3 × 4 × 5 = 120이 됩니다.
예제 2: while 루프 사용
같은 문제는 while 루프로도 해결할 수 있습니다. while 루프 버전에서는 반복 조건만 num != 0으로 검사하고, 루프 본문 안에서 num을 직접 나누어 준다는 차이점이 있습니다.
#include <stdio.h>
int main(){
int num, rem, product=1;
printf("enter the number : ");
scanf("%d", &num);
while(num != 0){
rem = num % 10;
product = product * rem;
num = num / 10;
}
printf(" result = %d", product);
return 0;
}실행 결과
enter the number: 257 result = 70 enter the number: 89 result = 72
257의 경우 2 × 5 × 7 = 70, 89의 경우 8 × 9 = 72가 출력됩니다.
마무리 정리
두 방식의 차이를 비교해 보면 다음과 같습니다.
- for 루프: 초기화, 조건 검사, 증감(여기서는 자릿수 제거)을 한 줄에 모아 작성할 수 있어 코드가 간결합니다.
- while 루프: 변수 초기화를 선언부에서 미리 하고, 반복 조건과 갱신 로직을 분리해서 표현합니다.
두 방법 모두 시간 복잡도는 O(log₁₀ n)으로, 숫자의 자릿수에 비례하여 실행됩니다. 나머지 연산자(%)와 정수 나눗셈(/)을 활용하는 이 패턴은 자릿수 합계 구하기, 자릿수 개수 세기, 회문 판별 등 다양한 알고리즘 문제에서도 응용되므로 꼭 익혀두시길 바랍니다.