BackEnd/JAVA

[JAVA] 배열로 로또 번호 점지 받기 (중복 없는 랜덤 정수)

뚜벅-뚜벅 2020. 11. 17. 17:19

연관된 데이터가 너무 많다면 일일이 변수를 선언해주는 것도 번거로운 일일 것입니다

이럴 때 배열을 사용합니다.

 

선언은 int[] arr1;

초기화는 arr1= { 2, 4, 6, 8 };

 

물론 여느 변수처럼 선언과 초기화를 함께 할 수 있습니다.

 

int[] arr1 = new int[4];

이와 같이 선언하면 4개 value를 가진 배열이 생깁니다. 각 value의 default 값은 0 입니다.

 

int[] arr1 = new int[] {2, 4, 6, 8};

이처럼 옆에 배열 값을 직접 입력하여 객체를 생성할 수도 있습니다.

참조변수처럼, arr1은 메모리 상에서 배열이 시작되는 주소값을 가집니다

 

이런 특성을 가진 배열을 이용해 46개의 정수중 6개를 뽑는 로또번호 추첨기를 만들어보겠습니다.

 

 

먼저, 공을 섞어야겠죠? 1~45 사이의 정수를 랜덤하게 하나씩 받습니다. 

	public static void main(String[] args) {
		
		int[] ball = new int [45];
		int[] finNum = new int [6];

		for(int i=0;i<45;i++) {
		ball[i] =(int)(Math.random()*45)+1; //0~44 사이의 랜덤 정수 받기
		 for(int j = 0; j<i;j++) {
			 if (ball[i]==ball[j])  //지금까지 만들어진 값들과 비교, 중복있으면 다시 랜덤 돌림.
				 i--;
		 }
		}

Math.random 메소드는 곱한 값 이하의 랜덤값을 반환하지만, 중복이 있는 경우가 있습니다.

그래서 이전까지 생성된 ball[ ] 배열과 순차적으로 비교하는 for문을 하나 더 심어줍니다.

만약 기존 값과 같은 번호가 생성되었다면 i--을 통해 외부 for문으로 돌아갑니다

한번도 생성된 적 없는 번호가 나올 때 까지 외부 for문이 반복됩니다.

 

이렇게 45개의 정수를 다 섞었다면, 다음의 코드를 통해 6개를 뽑습니다.

System.arraycopy(ball, 0, finNum, 0, 6);

카드를 섞어 맨 위에서 6장을 꺼내는 것과 같습니다. 

arraycopy메소드는 5개의 매개변수를 갖는데요

순서대로 1. 원본배열 2. copy를 시작할 인덱스 3. 복붙할 배열 4.paste를 시작할 인덱스 5.몇개나 복붙할지를 정합니다.

 

이렇게 finNum[]이라는 배열이 6개의 랜덤 정수로 치환되었는데요.

실제 로또 발행처럼 번호를 오름차순으로 정렬해보겠습니다.

 

아래는 배열을 입력받는 메소드입니다.

public static void func(int[] arr) {
		
		int temp=0;
		boolean change = false;
		for(int j=0;j<arr.length-1;j++) {
		for(int i=0; i<arr.length-1-j;i++) {
			if(arr[i]>arr[i+1]) {
				temp=arr[i];
				arr[i]=arr[i+1];
				arr[i+1]=temp;
				change= true;
			}
		}if(!change) break;
		}
	}

각 자리의 값을 비교하여 더 큰 수가 오른쪽으로 가도록 자리를 바꾸는 코드입니다.

temp라는 빈 공간을 이용해 각 밸류값을 바꿔치기 해줍니다.

 

이렇게 만든 메소드를 main 에서 호출합니다.

 

System.arraycopy(ball, 0, finNum, 0, 6);
func(finNum); //오름차순 정렬 
System.out.println("Lotto Number is "+ java.util.Arrays.toString(finNum));//호출

 

java.util.Arrays.toString(배열)은 아래와같이 대괄호 안에 value 를 순차적으로 출력해줍니다.

 

 

결과값이 나왔습니다.

이번주 로또 추첨결과가 어떨지 내심 기대되는 예제였습니다.