공룡호가 사는 세상 이야기

진태형에게 재귀가 약하다고, 알고리즘 문제를 하나 부탁했더니 '하노이 탑'을 해보란다. 그 문제는 재귀 중에도 어려운 재귀에 속하고, 소스를 이미 봐 버려서 안된다고 했더니, 이 문제를 하나 내준다.

ACM에 출제된 문제를 변형한 거라며, 풀어보란다.
문제를 다 풀고, 원래 문제를 찾아 봤더니 별로 바뀐게 없다.
그냥 내도 될 것을... 대체... 이걸 변형이라고 내 준건지. ㅋㅋㅋ
형 성의를 봐서, 문제와 소스를 첨부한다. 흐흐.-.-a

대 부분의 사람들은 비교적 작은 수의 로마 숫자와 친숙하다.
i, v, x, l, c는 각각 10진수 1, 5, 10, 50, 100을 나타낸다.


그외의 다른 값들을 앞의 기호들을 합한 숫자로 나타낸다고 하자.
예를 들면, 숫자 3은 i가 3개 모여서 만들어진 것이다. 73은 l이 1개, x가 2개, i가 3개로 이루어져 있다. 즉 가장 적은 로마숫자의 합으로 숫자를 표기할 수 있다고 한다.

입력
입력은 1에서 100사이의 정수들로 결정되며, 0을 제외한 각각의 정수는 각각의 다른 기호들이 몇 개씩 필요한지를 결정한다.

출력
입력으로 받은 각각의 정수에 대해 입력 받은 정수와 그에 따른 각각의 필요한 기호의 수를 한 줄에 출력한다.

입력 예제
1
2
22
87

출력예제
1 : i 1, v 0, x 0, l 0, c 0
2 : i 2, v 0, x 0, l 0, c 0
22 : i 2, v 0, x 2, l 0, c 0
87 : i 2, v 1, x 3, l 1, c 0

Explanation :
#include <stdio.h>
#include <stdlib.h>

int roma[5]={0};
int n;

int input(void)
{//입력
printf("A Number of Page : ");
scanf("%d",&n);
return n;
}

bool check(void)
{//입력에러 처리
if(n < 0 || n > 100)
return false;
else
return true;
}

void print(int *sn)
{//출력
printf("\n%d : i %d, v %d, x %d, l %d, c %d\n\n",
*sn, *(roma + 0), *(roma + 1), *(roma + 2), *(roma + 3), *(roma + 4));
}


void cal(int n)
{//계산 (개노가다 한다. 입력제한이 있으므로 상관없다)
if(n >= 100)
{
roma[4] = (n / 100);
n = n % 100;
cal(n);
}

if(n >= 50)
{
roma[3] = (n / 50);
n = n % 50;
cal(n);
}

if(n >= 10)
{
roma[2] = (n / 10);
n = n % 10;
cal(n);
}

if(n >= 5)
{
roma[1] = (n / 5);
n = n % 5;
cal(n);
}

if(n > 0 && n < 5)
{
roma[0] = (n / 1);
n = n % 1;
cal(n);
}
if(n == 0)
{
return;
}
}

void main(void)
{
int sn = input();

if(check()==false)
exit(1);

cal(n);

print(&sn);
}