본문 바로가기
Programming/C++

로또 번호 생성 및 짝맞추기

by 작은별하나 2014. 5. 5.
반응형
아마도 많은 대학 과제가 로또 번호 생성하는 것인 듯 합니다.

로또 번호를 생성하기 위해서는 배열을 잡고, 그 안에 랜덤 생성한 숫자를 넣는 방법이 있겠지만, 이 방법은 중복 검사를 하기 위해서도 매번 배열의 모든 값을 찾아봐야한다는 단점이 있습니다.



void GenLotto(int n[6])
{
  int i, j, c;
  for( i = 0 ; i < 6 ; i++ )
  {
    do
    {
    c = rand()%45;
    for( j = 0 ; j < i ; j++ )
    {
      if( n[j] == c ) break;
     }
    } while( j < i );
    n[i] = c;
}



이 방법이 나쁘다는 것만은 아닙니다.

그러나 루프 안에 루프, 또 루프.. 프로그램 자체가 보기 안 좋죠.

그래서 제 경우에는 메모리를 많이 쓰더라도 보다 간단한 알고리즘으로 생성하는 방법을 씁니다.


그래서 만든 프로그램이 다음과 같습니다.



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

void GenLotto(int n[45]);

void main()
{
	int isInLotto = 0;
	int isBonus = 0;
	int lotto[45];
	int i, n;

	GenLotto(lotto);

	for( i = 0 ; i < 6 ; i++ )
	{
		printf("Enter %dth number : ", i+1);
		scanf("%d", &n);
		if( lotto[n-1] ) isInLotto++;
	}
	printf("Enter bonus number : ");
	scanf("%d", &n);
	if( lotto[n-1] ) isBonus = 1;

	printf("Computer lotto number\n");
	for( i = 0 ; i < 45 ; i++ )
	{
		if( lotto[i] ) printf("%d ", i+1);
	}
	printf("\n");

	printf("Result : ");
	if( isInLotto == 6 ) printf("1st");
	else if( isInLotto == 5 && isBonus ) printf("2nd");
	else if( isInLotto == 5 ) printf("3rd");
	else if( isInLotto == 4 ) printf("4th");
	else if( isInLotto == 3 ) printf("5th");
	else printf("none");
	printf("\n");
}

void GenLotto(int n[45])
{
	int i;

	srand(time(0));

	for( i = 0 ; i < 45 ; i++ ) n[i] = 0;

	for( i = 0 ; i < 6 ; i++ )
	{
		while( 1 )
		{
			int c = rand()%45;
			if( n[c] == 0 )
			{
				n[c] = 1;
				break;
			}
		}
	}
}


아울러 위 소스를 실행해서 얻을 결과는 다음과 같습니다.




728x90

댓글