C++기초
220317(2) - 로또 숫자 뽑기 프로그램
hyrule
2022. 3. 25. 16:19
#include <iostream>
#include <time.h>
int main()
{
//만들기 전에: 스왑 알고리즘.
//swap: Number1과 Number2의 값을 바꿔주기
int Number1 = 20;
int Number2 = 30;
//Number2 = Number1 를 해버리면 Number2의 값은 사라져버림.
//그래서 중간 매개변수를 하나 만들어주어야 한다.
int Temp = Number1;
Number1 = Number2;
Number2 = Temp;
//1~45까지의 숫자가 있고, 이 숫자가 중복되면 안되게
//6개의 랜덤한 숫자를 얻어와야 한다.
srand((unsigned int)time(0)); //시드 설정
int Random = rand(); //랜덤값 추출
/*std::cout << rand() % 45 + 1 << std::endl;
std::cout << rand() % 45 + 1 << std::endl;
std::cout << rand() % 45 + 1 << std::endl;
std::cout << rand() % 45 + 1 << std::endl;
std::cout << rand() % 45 + 1 << std::endl;
std::cout << rand() % 45 + 1 << std::endl;*/
//단순히 숫자 6개를 연속으로 뽑으면 숫자가 중복될 확률이 있다.
//만약 중복되는 숫자가 있으면 새롭게 난수를 뽑아야 하기 때문에 계산할게 많아진다.
//해결법: 배열에 1~45까지의 숫자를 만들고 그 안에서 숫자를 섞고, 그 후에 앞에서 숫자 6개를 뽑으면 된다.
int Number[45] = {};
for (int i = 0; i < 45; ++i)
{
Number[i] = i + 1;
}
/////셔플 알고리즘 만들기
//45까지의 랜덤한 번호 두 개를 뽑아서 그 자리의 인덱스끼리 값을 교환.
//위의 배열 요소들의 값을 서로 바꿔 랜덤한 위치에 분배한다.
for (int i = 0; i < 100; ++i)
{
int Idx1 = rand() % 45;
int Idx2 = rand() % 45;
int Temp = Number[Idx1];
Number[Idx1] = Number[Idx2];
Number[Idx2] = Temp;
}
//잘 섞였는지 확인차 출력
for (int i = 0; i < 6; ++i)
{
std::cout << Number[i] << "\t";
}
std::cout << std::endl;
//6개의 결과를 정렬한다.
//이중 for문으로 만들어서, Number[i]와 Number[j]를 비교하여 작은 수가 있으면 바꿔준다.
for (int i = 0; i < 6; ++i)
{
for (int j = i + 1; j < 6; ++j)
{
if (Number[i] > Number[j])
{
int Temp = Number[i];
Number[i] = Number[j];
Number[j] = Temp;
}
}
}
//해당 정렬 알고리즘은 매우 간단하지만 느린 정렬 알고리즘이다.
//요즘은 힙정렬,퀵정렬,병합정렬 등을 사용
/////정렬 잘 되었는지 확인
std::cout << "\n*****정렬 결과*****" << std::endl;
for (int i = 0; i < 6; i++)
{
std::cout << Number[i] << "\t";
}
std::cout << " / " << Number[6] << std::endl;
std::cout << "===================================" << std::endl;
//원하는 횟수만큼 반복해서 뽑아주고, 위에서 뽑은 번호를 토대로 몇 등인지 판단해주는 프로그램
int Result[7] = {};
for (int i = 0; i < 7; ++i)
{
Result[i] = Number[i];
}
int GameCount = 0;
std::cout << "Input Game : ";
std::cin >> GameCount;
for (int Game = 0; Game < GameCount; ++Game)
{
for (int i = 0; i < 100; ++i)
{
int Idx1 = rand() % 45;
int Idx2 = rand() % 45;
int Temp = Number[Idx1];
Number[Idx1] = Number[Idx2];
Number[Idx2] = Temp;
}
for (int i = 0; i < 6; ++i)
{
for (int j = i + 1; j < 6; ++j)
{
if (Number[i] > Number[j])
{
int Temp = Number[i];
Number[i] = Number[j];
Number[j] = Temp;
}
}
}
for (int i = 0; i < 6; i++)
{
std::cout << Number[i] << "\t";
}
std::cout << " / " << Number[6];
int Pair = 0;
for (int i = 0; i < 6; ++i)
{
for (int j = 0; j < 6; ++j)
{
if (Result[i] == Number[j])
{
++Pair;
//j for문을 빠져나간다.(일치하는 숫자를 찾을 경우 이후 더이상 계산이 필요하지 않기 때문.
break;
}
}
}
//위 for문이 완료되면 Pair 변수에 숫자가 몇개가 같은지가 저장된다.
switch (Pair)
{
case 6:
std::cout << " : 1등";
break;
case 5:
bool Second;
Second = false;
//case문 내부에서는 변수의 선언과 동시에 초기화가 불가능하다.
//그러므로 따로 변수에 값을 지정하거나 코드블록으로 감싼 후 동시에 변수 선언과 초기화를 해 주어야 한다.
for (int i = 0; i < 6; ++i)
{
if (Result[6] == Number[i])
Second = true;
}
if (Second)
std::cout << " : 2등";
else
std::cout << " : 3등";
break;
case 4:
std::cout << " : 4등";
break;
case 3:
std::cout << " : 5등";
break;
default:
std::cout << " : 꽝";
break;
}
std::cout << std::endl;
}
return 0;
}