문제 상황
C 프로그래밍 언어만으로 입력받은 한 자리 또는 두 자리 숫자를 영어 단어 형태로 변환할 수 있을까요?
해결 방법
switch-case 문(선택문)을 활용하면 두 자리 숫자를 영어 단어 형식으로 손쉽게 변환할 수 있습니다. 두 자리뿐만 아니라 그 원리를 확장하면 어떤 크기의 숫자든 영어 표현으로 바꾸는 것도 가능합니다.
이번 글에서는 한 자리 또는 두 자리 숫자를 영어 단어 형식으로 변환하는 C 프로그램을 단계별로 살펴보겠습니다.
핵심 아이디어
0부터 19까지의 숫자는 ten, eleven, nineteen처럼 규칙성이 없는 고유한 영어 이름을 가지므로 각각 별도의 case로 처리합니다. 반면 20 이상의 두 자리 숫자는 십의 자리(no/10)와 일의 자리(no%10)로 나눈 뒤, 각 자릿수에 해당하는 단어를 중첩된 switch 문으로 차례대로 출력합니다.
예제 코드
#include <stdio.h>
int main(){
int no;
printf("enter any 1 or 2 digit number:");
scanf("%d", &no);
if(no < 0 || no > 99) // 입력값이 0~99 범위 안에 있는지 검사
printf("Invalid number");
else {
printf("entered number:");
switch(no){
/* 0~19는 고유한 영어 이름을 가지므로 개별 처리 */
case 0: printf("zero");
break;
case 10: printf("ten");
break;
case 11: printf("eleven");
break;
case 12: printf("twelve");
break;
case 13: printf("thirteen");
break;
case 14: printf("fourteen");
break;
case 15: printf("fifteen");
break;
case 16: printf("sixteen");
break;
case 17: printf("seventeen");
break;
case 18: printf("eighteen");
break;
case 19: printf("nineteen");
break;
default:
switch(no/10){ // 십의 자리 단어 출력
case 2: printf("twenty ");
break;
case 3: printf("thirty ");
break;
case 4: printf("forty ");
break;
case 5: printf("fifty ");
break;
case 6: printf("sixty ");
break;
case 7: printf("seventy ");
break;
case 8: printf("eighty ");
break;
case 9: printf("ninety ");
break;
}
switch(no%10){ // 일의 자리 단어 출력
case 1: printf("one");
break;
case 2: printf("two");
break;
case 3: printf("three");
break;
case 4: printf("four");
break;
case 5: printf("five");
break;
case 6: printf("six");
break;
case 7: printf("seven");
break;
case 8: printf("eight");
break;
case 9: printf("nine");
break;
}
}
}
return 0;
}
실행 결과
enter any 1 or 2 digit number:83 entered number:eighty three enter any 1 or 2 digit number:6 entered number:six enter any 1 or 2 digit number:548 Invalid number
코드 동작 원리
- 입력 및 유효성 검사:
scanf()로 정수를 입력받은 뒤, 값이 0 미만이거나 99를 초과하면 "Invalid number"를 출력하고 프로그램을 종료합니다. - 0~19 처리: ten, eleven, nineteen처럼 규칙적이지 않은 고유한 영어 이름을 가진 숫자들은 각각 독립된 case로 처리합니다.
- 20~99 처리(default):
no/10연산으로 십의 자리(2~9)를 추출해 twenty, thirty 등의 단어를 출력하고, 이어서no%10연산으로 일의 자리(1~9)를 추출해 one, two 등의 단어를 덧붙여 출력합니다.
참고 사항
원본 코드에는 몇 가지 오탈자가 있었습니다. 일의 자리 2에 해당하는 문자열이 숫자 0이 섞인 "tw0"로 잘못 작성되어 있었고, 90의 철자도 "ninty"가 아닌 올바른 표기인 "ninety"로 수정했습니다. 또한 십의 자리 단어 뒤에 공백을 추가해 "eighty three"처럼 자연스럽게 출력되도록 개선했습니다.
이 구조를 확장하면 세 자리 이상의 숫자도 처리할 수 있습니다. 백의 자리(no/100)를 먼저 판별해 "hundred"를 붙이고, 나머지 두 자리(no%100)에 위와 동일한 로직을 반복 적용하면 됩니다.