[C++] 연습 문제 : 로또 번호 생성기
👻 로또 번호 생성기
이번 시간에는 지난 시간에 배웠던 배열을 이용해 로또 번호를 생성해주는 기능을 구현해 볼 것이다. 중복이 안 된 6개의 숫자를 프로그램을 구동시킬 때마다 추출시켜주도록 만들어보았다.
🌱 정렬 기능 만들기
우선 로또 번호를 추출한 다음 오름차순으로 정렬해주기 위해 정렬 함수를 만들었다.
void Sort(int numbers[], int count) {
int temp = 0;
for (int i = 0; i < count - 1; i++) {
for (int j = i + 1; j < count; j++) {
if (numbers[i] > numbers[j]) {
Swap(numbers[i], numbers[j]);
}
}
}
}
배열과 배열 길이를 매개 변수로 받고 for문
으로 탐색 후 정렬해주는 함수를 만들었다. 내가 생각한 건 둘둘씩 비교해서 조건에 맞게 값을 바꿔주는 알고리즘이었다. 찾아보니 버블 정렬 방식이라고 한다. 왼쪽 값을 기준으로, 오른쪽 값들을 비교하며 왼쪽 값이 더 크면 swap 해주는 방식이다.
- Swap 함수
두 개의 값을 바꿔주는 Swap 함수는 참조 방식을 이용하여 간단하게 구현할 수 있었다.
void Swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
🌱 로또 번호 생성기 만들기
우선 로직을 먼저 생각하는 시간을 가졌었다. 30분 정도 걸렸던 듯..
랜덤으로 1~45 사이의 숫자 중 6개를 골라서 입력 받은 매개 변수 numbers
배열에 넣는 방식의 함수를 만들면 됐었다. 단, 중복이 없어야 하기 때문에 무한 체크를 하는 구간이 필요했다.
void ChooseLotto(int numbers[]) {
// TODO : 랜덤으로 1~45 사이의 숫자 6개 골라서 numbers에 넣기 (단, 중복이 없어야 함)
srand((unsigned)time(0));
bool hasDuplication = false;
for (int i = 0; i < 6; i++) {
numbers[i] = (rand() % 45) + 1;
}
hasDuplication = CheckDuplication(numbers);
// 중복 체크
while (hasDuplication) {
for (int i = 0; i < 6; i++) {
if (numbers[i] == 0) numbers[i] = (rand() % 45) + 1;
}
hasDuplication = CheckDuplication(numbers);
}
// 정렬
Sort(numbers, 6);
}
대략적인 코드 분석은 다음과 같다.
- 난수 시드 설정
srand((unsigned)time(0));
- 중복 체크 유무를 확인하기 위해 설정
bool hasDuplication = false;
- 6개의 난수 생성 및 numbers 배열에 추가
for (int i = 0; i < 6; i++) {
numbers[i] = (rand() % 45) + 1;
}
- 중복 체크 유무 위한 불리언 값 설정
hasDuplication = CheckDuplication(numbers);
여기서 중복 체크하는 부분을 따로 뺐다.
bool CheckDuplication(int numbers[]) {
bool ret = false;
for (int i = 0; i < 5; i++) {
for (int j = i + 1; j < 6; j++) {
if (numbers[i] == numbers[j]) {
// 중복 있으면 뒤 숫자 0으로 바꿈
numbers[j] = 0;
ret = true;
}
}
}
return ret;
}
중복이 있다면 오른쪽(비교 당하는) 수를 0으로 세팅해주고 중복이었다는 정보를 true
로 반환해주었다.
- 중복 없을 때까지 체크
중복이었던 수는 0으로 세팅되어 있는데, 이를 한 번 더 체크해서 0이면 랜덤 수를 한 번 더 다시 세팅해준다. 세팅이 끝나면 중복 체크를 다시 시도한다.
while (hasDuplication) {
for (int i = 0; i < 6; i++) {
if (numbers[i] == 0) numbers[i] = (rand() % 45) + 1;
}
hasDuplication = CheckDuplication(numbers);
}
👻 글을 마치며
지난 시간에 배웠던 배열을 확실히 익히기 위해 로또 번호를 생성해주는 프로그램을 구현해보았다. 아무래도 C++로 처음 배열을 다루다보니 배열을 여기저기에 선언해보기도하고 오류도 많이 경험해보기도 한 것 같다. 분명히 포인터로 바뀌니, 주소값이라는 것을 아는데도 cout으로 찍어보고 있다.. 그래도 다 만들고 나니까 어느정도 배열의 범위 개념을 익힐 수 있었던 것 같다. 배열은 원본값을 건드리니 값 변경이 쉽고 빨라서 편한 것 같다. 그대신 시점이 애매해서 활용하기가 조금 힘든 것 같았다. (사이즈 구하는 거 같은 거..)
Leave a comment