Java

로또 게임 만들어보기

에어팟맥스 2022. 6. 19. 18:17

먼저 45개의 배열의 방을 만들어준다.

public class Main_lotto_01 {

	public static void main(String[] args) {
		
		
	/*
	 	
	 	int ball ==>   1,   2,   3,   4,   5,   6, ...  43,  44,  45
	 			 ==> 101, 102, 103, 104, 105, 106, ... 143, 144, 145
	 			 
		int[] ball_arr = new int[45];
		
		        ---------------------------------------------------
		        | 0 | 1 | 2 | 3 | 4 | 5 | 6 | .... | 42 | 43 | 44 |
		        ---------------------------------------------------
	 	
	 	
	 */
     
 		int[] ball_arr = new int[45];

 

그 다음 만들어진 배열의 요소(방)마다 데이터값을 입력해준다.

		// ball_arr 배열의 요소(방)마다 데이터값 입력하기
		for(int i=0; i<ball_arr.length; i++) {
			
			ball_arr[i] = i+1;
			
		}
		/*      
		  			----------------------------------------------
	       값   ==> | 1 | 2 | 3 | 4 | 5 | 6 | .... | 43 | 44 | 45 |
		            ---------------------------------------------- 
		 index ==>   0   1   2   3   4   5          42   43   44
		          
		*/

 

그리고 기존에 뽑았던 공의 방번호(배열의 index)를 기억시켜두는 용도로 5개의 방을 가진 새로운 배열을 만들어준다.

		int[] temp_arr = new int[5]; // 기존에 뽑았던 공의 방번호(배열의 index)를 기억시켜두는 용도
		
		for(int i=0; i<temp_arr.length; i++) {
			temp_arr[i] = -1;
		}

  만약 위와 같이 -1 로 초기화를 해주지 않으면 모두 0으로 초기화가 된다.
  꺼내온 공의 방번호(index)가 0(실제는 1번공)이라면
  이미 뽑은 공이라고 보기 때문에 문제가 발생한다.
  그래서 배열의 방번호(index)로 사용되지 않는 숫자인 -1 로 모두 초기화한다.

 

공의 방번호(배열의 index)를 꺼내는 작업을 6번 반복한다.
0부터 44 까지인 index 를 랜덤하게 6개를 뽑아오도록 한다.
즉 0 ~ 44까지 난수를 발생시킨다.

 

계획)
첫번째로 뽑은  index가  3 ball_arr[ 3] ==> 실제 공번호  4
                                -------------------------
    temp_arr 값 ==> | -1 | -1 | -1 | -1 | -1 | 
                              -------------------------
 ###temp_arr 값은 기본값인 0 으로 초기화하면 안되고(중복 발생)

      배열의 방번호(index)로 사용되지 않는 숫자(e.g. 음수(-1))로 초기화 해야 한다. ###

두번째로 뽑은  index가  5 ball_arr[ 5] ==> 실제 공번호  6
                             ------------------------
temp_arr 값 ==> |  3 | -1 | -1 | -1 | -1 | 
                             ------------------------


세번째로 뽑은  index가  0 ball_arr[ 0] ==> 실제 공번호  1
                             -------------------------
temp_arr 값 ==> |  3 |  5 |  0 | -1 | -1 | 
                             -------------------------

네번째로 뽑은  index가  5 ball_arr[ 5] ==> 실제 공번호  6 ( 중복!! )
네번째로 뽑은  index가  3 ball_arr[ 3] ==> 실제 공번호  4 ( 중복!! )
네번째로 뽑은  index가  8 ball_arr[ 8] ==> 실제 공번호  9 

                             -------------------------
temp_arr 값 ==> |  3 |  5 |  0 |  8 | -1 | 
                             -------------------------

다섯번째로 뽑은 index가  2 ball_arr[ 2] ==> 실제 공번호  3
                             -------------------------
temp_arr 값 ==> |  3 |  5 |  0 |  8 |  2 | 
                             -------------------------

여섯번째로 뽑은 index가  8 ball_arr[ 8] ==> 실제 공번호  9 ( 중복!! )
여섯번째로 뽑은 index가 44 ball_arr[44] ==> 실제 공번호 45

		Random rnd = new Random();
		String result = "";
		
		outer:
		for(int i=0; i<6; i++) {
			
			// 랜덤한 정수 = rnd.nextInt( 마지막수 - 처음수 + 1) + 처음 수;
			int idx = rnd.nextInt(44 - 0 + 1) + 0; // 0 ~ 44 중 랜덤한 수
			
			// 위에서 얻어온 랜덤한 정수 idx가 이미 뽑은 것인지 처음으로 뽑은 것인지 비교
			for(int j=0; j<temp_arr.length; j++) {
				if( idx == temp_arr[j] ) {
					
					i--; // i 를 감소시키지 말고 유지하기
									// continue; 가장 가까운 증감식으로(j++) 이동한다.
					continue outer; // continue outer; 레이블명이 outer인 반복문의 증감식(i++)으로 이동한다.
				}
					
			} // end of for
			
			if(i<5) {
				temp_arr[i] = idx; // 뽑은 방번호(index)를 저장시켜둔다.
			}
			
			String str = (i<5) ? "," : "" ;
			result += ball_arr[idx]+str; // 4,6,1,9,3,45
			
		} // end of for
		
		System.out.println("\n로또 1등 당첨번호: " + result);
		
	} //end of main()

}