Home C언어로 배열에 중복되지 않는 로또수(랜덤수) 출력하기
Post
Cancel

C언어로 배열에 중복되지 않는 로또수(랜덤수) 출력하기

파일정리하다가 튀어나온 C언어로 배열에 중복되지 않는 로또수(랜덤수) 출력하기를 포스팅해볼려고 한다.

이거는 내가 강렬하게 기억하는게 작년에 이 문제가 나왔는데 어버버거리면서 틀린 기억이 난다.

로또수를 출력하는 방법은 여러가지가 있는데 3가지를 다 해볼려고 한다. 물론 실기때는 잘기억 할 수 있는 1개만 있어도 되겠지만

작동코드

아래애 있는 코드는 C++이라면 추가해야하지만 C언어라면 없어도 가능하다.

1
2
3
4
5
#include <stdio.h>
#incldue <stdilb.h>
#incldue <math.h>

srand(time(NULL))

방법 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
	int k,i,j,lotto[6];
	puts(" random수 중복 안되게 발생하기");
	puts("=========방법 1=========");
	srand(time(NULL)); 
	for(i=0; i<6; )
	{
		lotto[i]=rand()%6;
		for(j=0,k=0; j<i; j++)
		{
			if(lotto[i]==lotto[j])
			{
					k=1; break;
			}
		}	
		if(k==0)
			i=i+1;
	}	
	puts("로또 숫자 출력");
	for(i=0; i<6; i++)
		printf("%d\t", lotto[i]);
	puts("");

일단 기본적으로 랜덤 수를 출력하기 위한 rand()인데 이것만 사용하면 c언어 프로그램 자체에 가지고 있는 랜덤수 테이블을 가져오기 때문에 계속 출력해도 같은 수가 나온다.

그래서 srand(time(NULL))을 입력해서 시간에 따라서 다른 수가 나오게 할 수 있다.

일단 여기서는 변수가 4가지가 필요하다. lotto배열, 숫자를 카운트할 i j k

첫번째 for문에서 가장 먼저 1번 배열인 0번부터 lotto를 입력을 해준다. 여기서 i를 가지고 카운트를 하는데 추가하는 조건은 적지 않는다.

두번째 for문에서 중복수를 검사하는데 j와 k를 0부터 i까지 한다.

i가 4번째라면(3) j는 0,1,2까지 같은지 검사를 하고 빠져 나온다.

그런데 만약 같은 수가 있다면 k에다가 1을 집어 넣고

아니라면 k를 0을 그대로 가져가고 로또의 번호를 체크하는 i에다가 1을 더한다.

만약에 같은 수가 나온다면 i값이 증가하지 않았기 때문에 다시 값을 집어 넣을 것이다.

결국에는 서로 다른 값이 나올때 까지 진행 할 것이다.

i에다가 1을 더하는 if문을 2번째 for문이 아닌 첫번째 for문에 넣는다는 점 주의

방법 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
	puts("=========방법 2=========");
	for(i=0; i<6; i++ )
	{
		lotto[i]=rand()%6+1;
		for(j=0; j<i; j++)
		{
			if(lotto[i]==lotto[j])
					i--;
		}	
	}	
	puts("로또 숫자 출력");
	for(i=0; i<6; i++)
		printf("%d\t", lotto[i]);
	puts("");

두번째 방법은 다 똑같은데 좀더 심플하다. 하지만 원리는 동일하다. \

이번에는 첫번째 for문에 i도 ++카운트를 하지만

이전 수와 같은게 있다면 i–로 빼고 바로 넘어간다.

결국에는 같다면 숫자가 -1되고 다시 +1되니 같은 배열에다가 집어 넣게 된다.

그리고 같지 않다면 끝까지 돌게된다는 의미

방법 3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
puts("=========방법 3=========");
	for(i=0; i<6;  )
	{
		temp=rand()%6+1;
		for(j=0; j<i; j++)
		{
			if(lotto[j]==temp)
				break;
		}	
		if(i==j)
			lotto[i]=temp, i++;
	}	
	puts("로또 숫자 출력");
	for(i=0; i<6; i++)
		printf("%d\t", lotto[i]);
	puts("");
}

변수는 똑같은데 조금더 번거로운 방법이다. 그다지 추천하지 않는 방법이기도 한데

일단 바로 집어넣지 않고 temp라는 변수에다 집어 넣고, for문에서 같은가 물어보고

같은게 없다면 lotto[i]=temp 해서 집어 넣어 준다.

문득보다보면 C나 C++이나 아마 안쓰게될 확률이 높은데… 자료구조도 그렇고 열심히도 공부한거 같다. 보통 이런 언어들은 메모리에 직접 엑세스할 수 있기에 속도가 빠르다는 장점이 있지만 게임제작이나 반도체쪽에서나 다루지 요즘 많이 사용하는 데이터분석이나 여러가지는 파이썬이 대세인지라

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.

C언어 조건연산자 If, 반복문 while, for 연습 문제 풀이

깊이 우선 탐색을 위한 파이썬 알고리즘 DFS