안녕하세요 베네입니다
주변에 c를 공부하는 사람들이 많아 조금이라도 지식을 전하고 싶어
간단한 로또 알고리즘을 들고 왔습니다
C를 처음 접하시는 분들께 도움이 됐으면 합니다.
최대한 이해 하기 쉽도록 설명해보았습니다.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main()
{
int lotto[6] = { 0 };
int i, j, idx=0, lot, tmp;
srand((unsigned)time(NULL));
설명을 하자면
우선 rand와 time 함수를 사용하기 위해 위에 #include <stdlib.h>와 <time.h> 지시문을 추가합니다.
그리고 첫 번째 int lotto[6] 선언해 0번부터 5번 방까지 0으로 초기화해주고
i, j, idx, lotm tmp를 선언 그리고 srand((unsigned)time(NULL));난수생성함수를 선언합니다.
while (lotto[5] == 0) // lotto의 5번째 방이 0일때 까지
{
lot = rand()%(45 - 1 + 1) + 1;
for(i = 0; i < idx; i++)
if (lotto[i] == lot) break;
if (i == idx) //i와 idx는 같아야함
{
lotto[idx] = lot;
idx++;
}
}
반복문을 선언해 줍시다.
이제 로또에 반복된 수가 없도록 걸러주는 알고리즘을 만들어줄 겁니다.
while (lotto[5] == 0)
위는 무슨 의미냐면 lotto의 5번 방이 0일 때까지 반복하는 것입니다.
5번 방이 0이 아니라면 다른 수가 채워져 6개의 로또번호가 모두 발행된 것 이겠죠
lot = rand()%(45 - 1 + 1) + 1;
0부터 45까지의 랜덤수를 발행해 lot에 넣어달라는 명령이고요
for문은 i는 0이고 i가 idx보다 작을 때까지 반복합니다.
만약 lotto i번째 방에 있는 값이 방금 생성한 난수의 값 lot와 같다면 break 해서 for문을 빠져나오라는 것입니다.
그럼 다시 i=0부터 다시 시작해 이번엔 같은 값이 아니라면
i를 1 증가시켜 다시 반복합니다. 하지만 조건문 i<idx 에 걸려서 for문을 빠져나오겠죠
이때 i와 idx의 값이 같다면
lotto[idx]번 방에 lot 값을 넣어주고
idx를 하나 증가시켜주는 것입니다.
즉 lotto 0번 방에 lot값이 들어갔겠죠
45라는 값이 들어갔다고 가정해 봅시다.
그럼 다시 이번엔 idx가 1이고 i는 0부터 시작합니다.
i 번째 (0번째) 방에 들어있는 45와 방금 생긴 lot의 값이 같은지 확인합니다.
만약 같다면 for문을 break 하고 다시 반복합니다.
같지 않다면 i와 idx의 값이 같은지 확인하고 같지 않다면 i를 1 증가시켜 다시 반복합니다.
이번엔 1번 방입니다. 1번 방과 lot의 값이 같은지 확인합니다.
1번째 방은 0으로 초기화돼있으니 같지 않고
i와 idx의 값이 같아졌으니 if문에 걸려
lotto[1]에 lot 값이 넣어지겠죠
이렇게 계속 반복해 5번 방에 lot값이 들어가는 순간 끝이나 로또 발행이 끝납니다.
방금 설명한 부분이 C를 처음 접해 만드시는 분들이 가장 힘들어하는 부분입니다.
그리고 이제 Sort를 해봅시다.
for (i = 0; i < 6; i++)
{
for (j = i+1; j < 6; j++)
{
if (lotto[i] > lotto[j])
{
tmp = lotto[i];
lotto[i] = lotto[j];
lotto[j] = tmp;
}
}
}
여기도 많이들 헷갈려하시는데 설명해 드리자면
이중 for문입니다.
i=0일때 안쪽에 있는 for문에 들어가 j=i+1부터 즉 1부터 5까지 반복 후 빠져나오게 됩니다.
그리고 i의 값이 1 증가되고
다시 안쪽 for문으로 들어가
i=1일일때 j가 2부터 5까지 반복 후 빠져나오는 것입니다.
이게 뭐냐면 1번 방일 때 2번부터~5번 방을 비교해주고
3번 방이라면 4번부터~5번 방을 비교해주는 겁니다.
그리고 비교중에
if (lotto[i] > lotto[j])
i번째 방의 값이 j번째 방의 값보다 크다면
tmp = lotto[i];
lotto[i] = lotto[j];
lotto[j] = tmp;
tmp에 i번 값을 저장하고
lotto i번에 j값을 넣은 후
j번에 tmp값을 넣으면
서로의 자리가 스왑 되는 것이죠
이런 느낌인 겁니다. 굉장히 간단하죠?
이런 식으로 비교하게되면 자연스래 오름차순 소트 배열이 완성됩니다.
그럼 내림차순을 만들고 싶다면?
부등호만 바꾸어주면 됩니다.
그래서 위에서 배운 방법을 통해서 코딩을 해보면
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main()
{
int lotto[6] = { 0 };
int i, j, idx=0, lot, tmp;
srand((unsigned)time(NULL));
while (lotto[5] == 0)
{
lot = rand()%(45 - 1 + 1) + 1;
for(i = 0; i < idx; i++)
if (lotto[i] == lot) break;
if (i == idx)
{
lotto[idx] = lot;
idx++;
}
}
printf("발행번호: ");
for (i = 0; i < 6; i++)
printf("%d\t", lotto[i]);
printf("\n");
for (i = 0; i < 6; i++)
{
for (j = i+1; j < 6; j++)
{
if (lotto[i] > lotto[j])
{
tmp = lotto[i];
lotto[i] = lotto[j];
lotto[j] = tmp;
}
}
}
printf("로또번호: ");
for (i = 0; i < 6; i++)
printf("%d\t", lotto[i]);
}
이런식으로 코딩하면 되겠죠
for문안에 printf를 넣은 이유는
0번부터 5번까지의 수를 찍어줘야 하기 때문에
for문에 넣어 i값을 증가시키며 반복해주면 쉽게 출력이 가능합니다.
그럼 코딩 창을 확인해 봅시다.
이렇게 나오게 됩니다.
정말 간단합니다.
차근차근 조금씩 뜯어서 들여다보시면 충분히 쉽게 이해하실 수 있을 겁니다.
잘 이해가 되셨을지 모르겠네요
제가 실수한 부분이 있을지도 모르겠지만 도움이 되셨길 바랍니다.