개발/Java

자바 반복문과 배열을 활용한 로또 조합 출력 예제 :)

냐냐_ 2021. 3. 18. 23:38

 

살면서 로또라곤 딱 세 번 정도 해봤는데... (그 중 한 번은 오만원 당첨!) (설마 운을 다쓴건가)

자바를 공부하면서 예제로 풀게 되어 재밌었다.

 

수업 중엔 Random 클래스를 활용해서 풀었던 예제인데,

지난 포스팅에 적었던 Math.random()을 활용한 예제로 응용해서

오랜만에 다시 짜 보았다.

 

 

 

 

 

자바로 로또 번호 출력하기

조건 1 ) 가로로 6개의 숫자가 나열

조건 2 ) 위 조건 1) 의 숫자들은 중복되어서는 안 됨

 

 

요렇게 콘솔에 출력되면 된다.

 

 

먼저 구조를 보면, 결국은 숫자 6개짜리 배열이 총 5줄 반복된 셈이다.

숫자가 6개 찍히도록 반복문을 돌리고,

그 반복문을 감싸서 원하는 줄 (이 예제에서는 5줄) 수만큼 반복되게 또 돌리면 된다.

 

 

 

 

 

안쪽 반복문 (6개짜리 1줄) 코딩하기

이전 포스팅에서 난수를 추출할 때 Math.random()을 사용할 수 있고,

난수의 범위를 컨트롤하기 위해서 적절하게 수를 곱해서 사용하면 된다고 했었다.

로또 숫자는 0보다 크고 100보다 작은 수를 쓴다고 하니,

 

(int) (Math.random() * 99) + 1;

 

이렇게 쓰면 될 것이다. 

(헷갈릴 땐, 0.99999 에 값을 곱해보면 된다.

0.99999 * 99를 하면 숫자 99를 넘을 수 없다. 그래서 1을 더해준 것!)

그렇게 얻은 이 랜덤한 숫자를 배열에 집어넣어 준다.

 

int sixnumbers[] = new int[6]; // 숫자 6개짜리 배열 선언 (길이만 선언)
		
for (int i = 0; i < sixnumbers.length; i++) {
	sixnumbers[i] = (int) (Math.random() * 99) + 1;
	System.out.println(sixnumbers[i]+"\t");

}

이렇게 sixnumbers 라는 배열을 만들어서 반복문을 배열의 길이(=6) 만큼 돌리면

6개의 수가 잘 출력된다.

 - print"ln"을 하면 줄바꿈이 되기 때문에 그냥 print를 썼고, 간격을 두기 위해 "\t"를 넣었다.

 

 

요렇게 나옴. 일단 절반은 성공!

 

 

 

 

 

그런데... 아직 좋아하기 이르다!

중복 제거를 해주어야 한다!

수업 중 배웠던 방법은 아래와 같다.

 

1) 첫번째 값은 어차피 혼자니까 중복체크를 안 해줘도 된다.

2) 두번째 값이 첫번째 값과 같으면 다시 난수를 뽑는다.

3) 세번째 값이 첫번째 값, 두번째 값 중 하나와 같으면 다시 난수를 뽑는다.

.

.

.

6) 여섯번째 값이 첫번째 ~ 여섯번째 값 중 하나와 같으면 다시 난수를 뽑아주면 됨!

 

 

 

 

 

정답부터 적고 풀이를 적기로.

 

int sixnumbers[] = new int[6];

for (int i = 0; i < sixnumbers.length; i++) {
    sixnumbers[i] = (int) (Math.random() * 99) + 1;

    for (int j = 0; j < i; j++) {
        if (sixnumbers[i] == sixnumbers[j])
            i--;
    }
}

 

6개의 숫자를 돌리는 반복문 '안'에 또 다른 반복문을 돌린다.

여기서 j<i 라는 조건을 잘 보아야 하는데,

로직 순서대로, 최대한 문과스럽게(?) 적어 보았다.

 

i=0 sixnumbers[0] 값 선언 j<i 조건에 의해서 sixnumbers[j]는 성립 불가능
j 반복문 돌지 않음
i-- 될 일 없음
i=1 sixnumbers[1] 값 선언 j<i 조건에 의해서 반복문은 j=0 일 때 한 번만 돌아감
sixnumbers[1] == sixnumbers[0] 이면
i=0부터 다시 돌림
sixnumbers[1] != sixnumbers[0] 이면 i++
i=2 sixnumber[2] 값 선언 j<i 조건에 의해서 반복문은 j=0, j=1 일 때 두 번 돌아감
sixnumbers[2] == sixnumbers[0],
sixnumbers[2] == sixnumbers[1] 두 가지를 검사함
.
.
.
i=5 일 때까지 반복!
   

 

이렇게 중복을 제거해 준다.

 

 

 

 

 

바깥쪽 반복문 (5줄로 만들기) 코딩하기

이제 한 줄을 완성했으니 5줄 만드는 건 어렵지 않다.

완성한 안쪽을 5번 돌려주면 된다.

 

for (int k = 0; k < 5; k++) {
    int sixnumbers[] = new int[6];

    for (int i = 0; i < sixnumbers.length; i++) {
        sixnumbers[i] = (int) (Math.random() * 99) + 1;

        for (int j = 0; j < i; j++) {
            if (sixnumbers[i] == sixnumbers[j])
                i--;
        }
    }

    for (int i = 0; i < sixnumbers.length; i++) {
        System.out.print(sixnumbers[i] + "\t");
    }
    System.out.println(); // 각 줄마다 줄바꿈을 위한 코드 
}

 

요렇게 k반복문을 5번 돌리면 끝!

줄바꿈을 해 주어야 로또 용지처럼 출력된다 :)

 

배열, 다중 for문(중첩 for문)을 연습하기 좋은 예제인 것 같다.