프로그래밍/실습

로또 번호 생성

hscho00 2020. 6. 19. 19:43

2차원 배열 / 중복 제외 랜덤 숫자 생성 / 버블 정렬

 

 

잠시 1학년의 기분으로 돌아가(...) 과제를 하려니 생각보다 시간이 걸려 충격받기도 해서 

반성하자는 마음으로 포스팅

 

특히 중복 숫자 체크하기 위해 bool 배열 사용한 부분

머리로는 알고있는데 실제로 쳐보려니 오래 걸렸다............


2차원 배열은 원소로 1차원 배열을 가진다고 생각하자

 

자료형 변수명[ 행(가로의 개수) ][ 열(세로의 개수) ];

행 : 1차원 배열 몇 개를 가질 것인가

열 : 1차원 배열은 원소 몇 개를 가지는가

 

int arr[2][3];

> int 3개 세트가

> 2쌍 있다! (뒤에서부터 읽으면 편함


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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <iostream>
#include <ctime>
using namespace std;
 
void NumberGenerator(int arr[], int size);
void BubbleSort(int arr[], int size);
 
int main()
{
    srand((unsigned int)time(NULL));
 
    const int ROUND_COUNT = 6;    // row. n 회차
    const int NUMBER_COUNT = 6// col. 한 row의 원소 개수
 
    // 2차원 배열 선언
    int lottoNums[ROUND_COUNT][NUMBER_COUNT] = {};
 
    // 번호 생성
    for (int i = 0; i < ROUND_COUNT; ++i)
    {
        // (i + 1)회차 번호 생성
        NumberGenerator(lottoNums[i], NUMBER_COUNT);
    
        // bubble sort로 정렬
        BubbleSort(lottoNums[i], NUMBER_COUNT);
    }
    
    // 2차원 배열 출력
    for (int i = 0; i < ROUND_COUNT; ++i)
    {
        cout << (i + 1<< " 회차 : ";
        for (int j = 0; j < NUMBER_COUNT; ++j)
            cout << lottoNums[i][j] << '\t';
        cout << endl 
            << "=====================================================" << endl;
    }
    
    return 0;
}
 
void NumberGenerator(int arr[], int size)
{
    const int MAX_NUM = 45;
    bool UsedNumsArray[MAX_NUM] = {};    // 중복 숫자 체크용 bool 배열
 
    for (int i = 0; i < size++i)
    {
        int generated = -1;
        do
        {
            generated = rand() % MAX_NUM;    // 0 ~ (MAX_NUM - 1)
        } while (UsedNumsArray[generated]);    // 먼저 사용된 숫자라면 다시 rand()
 
        arr[i] = generated + 1;    
        UsedNumsArray[generated] = true;
    }
}
 
void BubbleSort(int arr[], int size)
{
    for (int i = 0; i < size++i)
    {
        // 마지막 인덱스의 전 인덱스까지만 비교해야 함 (-1)
        // 회차를 거듭할수록 큰 숫자가 맨 뒤로 간다.
        // 따라서 i만큼 비교하지 않아도 됨 (-i)
        for (int j = 0; j < size - 1 - i; ++j)
        {
            // 앞의 숫자가 뒤의 숫자보다 크면
            if (arr[j] > arr[j + 1])
            {
                // swap
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1= temp;
            }
        }
    }
}
cs

 

실행 결과