// 091113_card_01.cpp : Defines the entry point for the console application.
//
/*--------------------------------------------------------------*
| 3. 숫자카드 |
| |
| 입력형식 : input.txt (첫 라인에 카드의 숫자를 차례로 나열) |
| - 최초 rand()를 사용하여 카드의 숫자를 얻었으나 |
| 문제의 입력형식과 출력형식이 의도하는 바와 |
| 달라서 수정하였습니다. |
| 출력형식 : output.txt (첫 라인에 가능한 카드 배열의 수 출력) |
*---------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h> // srand(), atoi()를 위한 include
#include <string.h> // strlen()을 위한 include
// initialize ; input.txt는 최대 40자 이하의 숫자
int data[40], cnt = 0;
FILE *fIn, *fOut;
/*---------------------------------------------------------------
void random()
{
int a = 0;
int n, cnt = 0;
// srand((int)time(NULL));
printf("? ");
scanf("%d", &n);
while(n)
{
// 중복된 수에 대한 처리도 해야 하는가?
a = rand() % 34 + 1;
printf("= %d\n", a);
if(a > 10)
{
data[cnt++] = (int)(a/10);
data[cnt] = a - data[cnt - 1] * 10;
}
else data[cnt] = a;
cnt++; n--;
}
// 배열 확인
for(n = 0; n < cnt; n++)
printf("> %d\n", data[n]);
}
---------------------------------------------------------------*/
// recursive를 통해 data[]의 끝부터 차례로 경우의 수를 모색
void analyze(int n)
{
int a;
// 1회 분석이 끝나면 cnt++
if(n == -1)
{
// printf("\n\t[cnt]\n");
cnt++;
}
else
{
if(n > 0)
{
a = data[n - 1] * 10 + data[n];
// 34 이하일 경우 카드 배열 중 하나로서 성립 -> n - 2 부터 분석
if(a <= 34)
{
// printf("in(%d) ", a);
analyze(n - 2);
// printf("out(%d) ", a);
}
}
// printf("in(%d) ", data[n]);
analyze(n - 1);
// printf("out(%d) ", data[n]);
}
}
void main()
{
char ch;
int n = 0;
fIn = fopen("input.txt", "r");
fOut = fopen("output.txt", "w");
// 난수발생 -> input.txt로의 입력 변경
// random();
// input.txt를 int형 array data[40]로 load, EOF까지 while
while((ch = fgetc(fIn)) != EOF)
data[n++] = atoi(&ch);
analyze(n - 1);
// 가능한 카드 배열의 수 출력
fprintf(fOut, "%d", cnt);
}
만들일이 생겨서... 그냥 올려봄 =)