(혼) (공) (자)

배열-로또번호 생성기

만석이 2023. 12. 28. 23:49

지금까지 배운것들과 배열을 사용해서 로또번호 생성기를 만들어보려고한다. 

 

먼저. 로또에 대해서 간단히 설명하겠다.

 

1번부터 45번까지의 번호를 랜덤으로 뽑으며 

 

1등은 6개

2등은 5개 +보너스번호

3등은 5개 

4등은 4개 

5등은 3개 

나머지는 낙점이다.

 

 

바로 예제를 보자


 

//1 부터 45번의 공을 모두 가진다.

int[] lottoMachin = new int [45];

 

//선택된 로또 번호를 저장할 배열

int[] lottoBalls = new int[6];

 

//보너스번호 저장

int bonusNumber = 0;

 

 

//1~45개의 공을 생성 Index는(0~44)

for (int i=0;i<lottoMachin.length;i++) {

 

lottoMachin[i] = i+1;

 

}

 

int count = 0;

 

while(count < 7) {

//공을 선택하는 위치를 랜덤함수로 골라보자!

int index = (int)(Math.random()*45);

 

 

//선택된 index 의 값이 0 이 아니면 미사용..0이면 사용한 위치

if(lottoMachin[index] != 0) {

 

if(count <6) {

lottoBalls[count++] = lottoMachin[index];

}else{

bonusNumber = lottoMachin[index];

count++;

}

 

 

//사용을 했다는 의미

lottoMachin[index]=0;

 

}

 

}

for(int i=0;i<lottoBalls.length;i++) {

System.out.print(lottoBalls[i]+" ");

}

 

System.out.println("보너스 번호:"+bonusNumber);

 

 

//사용자가 선택!

count = 0;

Scanner scan =new Scanner(System.in);

//사용자 로또 저장 배열

int[]userLotto = new int[6];

 

while(count<6) {

 

System.out.println((count+1)+"번째 로또 번호! :");

int balls = scan.nextInt();

 

//중복체크

for(int i=0;i<count;i++) {

if(userLotto[i]==balls) {

System.out.println(balls+"는 이미 존재하는 번호입니다.");

balls = 0; //중복되었다는 의미

break;

}

}

//0 은 중복의 의미

if(balls !=0) {

userLotto[count++] = balls;

}

}

 

scan.close();

 

System.out.println("사용자 로또 : ");

for(int i=0; i<lottoBalls.length;i++) {

System.out.printf(userLotto[i]+" ");

}

 

System.out.println();

 

int machCount = 0;

boolean isBonus = false;

 

for(int i=0; i<userLotto.length;i++) {

for(int j=0; j<lottoBalls.length;j++) {

 

if(userLotto[i]==lottoBalls[j]) {

machCount ++;

break;

}

}

 

 

//보너스번호 맞는것 찾기

if(!isBonus) {

if(userLotto[i]==bonusNumber) {

isBonus = true;

}

}

}

if(machCount == 6) {

System.out.println("1등~");

}else if(machCount ==5 && isBonus) {

System.out.println("2등~");

}else if(machCount ==4) {

System.out.println("3등~");

}else if(machCount == 3) {

System.out.println("4등~");

}else {

System.out.println("낙점");

}

}

 


 for (int i=0;i<lottoMachin.length;i++);
lottoMachin[i] = i+1;

 

lottoMachin은 0부터 44까지의 방이있다.

i+1이 있기때문에 0번방에는 1이 들어가게된다.(반복)

0번방은1, 1번방은2, .....44번방은 45가 들어가게된다.

 

while(count < 7) {
int index = (int)(Math.random()*45); 

 

공을 6개 뽑는다 

 index변수에 뽑은 값을 넣는다.(반복)

예를 들어서 0,5,39,20,23,39,22 를 뽑았다고 가정하자

 

 if(lottoMachin[index] != 0) {
if(count <6) {
lottoBalls[count++] = lottoMachin[index];
}else{
bonusNumber = lottoMachin[index];
count++;
lottoMachin[index]=0;
}

첫번째로 0을 뽑았다. 
lottoMachin[0] 의 값은 1이다.
즉 0이 아니기에 조건이 충족되어 if문이 돌아간다.
lottoBalls[count++] = lottoMachin[0]
해석해보면
 lottoMachin[0]의 1값이  lottoBalls[count++]안으로 들어가는것인데
count값을 0으로 초기화 해주어서 lottoBalls[0]이 되고 그 안에 1이 들어가게되는것이다. 

그리고 뽑은 숫자를 또 중복해서 뽑으면 안되기때문에 
lottoMachin[index]=0 를 해줘야한다. 
처음에 0을뽑고 lottoMachin안에 값을 넣어준 후 
lottoMachin[index]=0 하게되면 
index[0]=1 이였지만 index[0]=0 으로 바뀌게 된다.

그렇게되면 다시한번 0을 뽑아도 if조건에 충족되지않기에 
index 값을 다시뽑게 되는것이다.


현재 상황 그림참고.(마지막 번호 22는 보너스 번호이다.)
0 5 39 20 23 29 22


그리고 6개 까지 index값을 뽑게되면
if(count <6)인해서 
else{bonusNumber = lottoMachin[index]; 가 실행되게 된다.
마지막 값이 bonusNumber변수에 들어가게된다.