[Math.random()] 로또 번호 생성 프로그램

2022. 10. 6. 08:12Dev.Program/Java & Spring

728x90

[로또 번호 생성 프로그램 만들기 과제]

[ 문제 ] 로또 번호 생성 프로그램 만들기
1 ~ 45 사이의 중복되지 않는 난수 6개를 생성하여 배열에 저장한 후, 
임의로 지정된 1등 당첨번호와 비교하여 일치하는 개수를 출력하는 프로그램

[ 출력 결과(예시) ]
나의 로또 번호 : 10, 15, 30, 35, 37, 40
1등 당첨번호 : 1, 10, 15, 19, 30, 45
일치하는 번호 개수 : 3개

[ 프로그램 작성 조건 ]
1. 난수 6개(로또번호)를 저장할 배열명 : myLotto
   ⇒ 중복된 숫자가 저장되지 않도록 중복 제거 필수!
  (숫자 6개라고 6바퀴만 돌리면 안되고 중복 안될때까지 계속 돌려야됨!!!)
2. 1등 당첨번호를 저장할 배열명 : thisWeekLotto
  (저장할 숫자 : 10, 19, 1, 30, 45, 15)
3. 화면에 출력할 나의 로또 번호와 1등 당첨번호는 오름차순으로 정렬한 뒤 출력
   ⇒ Arrays.sort() 메서드 활용 (→ 배열만 넣으면 정렬 p.159~160)
4. 난수 발생은 Math.random() 메서드 사용



로또 < 풀이 >

import java.util.Arrays;

public class Test1 {

public static void main(String[] args) {

int[] myLotto = {34, 41, 13, 18, 8, 21}; // 내가 찍은 번호
int[] thisWeekLotto = new int[7];

// 이번주 당첨 번호(매주 추첨)

// thisWeekLotto에 중복없이 숫자 6개 담기
for(int i = 0; i < thisWeekLotto.length; i++) {
thisWeekLotto[i] = (int)(Math.random() * 45 + 1);

// 난수 생성하여 배열에 저장
for(int j = 0; j < i; j++) {

⇒ 이 부분을 ‘<= i’ 로 하면 반복을 줄일 수 있다
if(thisWeekLotto[i] == thisWeekLotto[j]) {

// 생성된 번호 비교
i--;

// 중복이면 다시 저장하러 바깥for문으로 돌아감
break;
}
}
}

Arrays.sort(myLotto); // 나의 로또 번호 정렬
System.out.print("나의 로또 번호 : ");
for(int i = 0; i < myLotto.length; i++) {
System.out.print(myLotto[i]);
for(int j = 0; j < myLotto.length-1; j++) {
if(myLotto[i] == myLotto[j]) {
System.out.print(", ");
}
}
} // 나의 로또 번호 출력

System.out.println();

Arrays.sort(thisWeekLotto, 0, 6);

// 보너스 번호 thisWeekLotto[6] 제외하고 정렬
System.out.print("1등 당첨번호 : ");
for(int i = 0; i < thisWeekLotto.length-1; i++) {
System.out.print(thisWeekLotto[i]);
for(int j = 0; j < thisWeekLotto.length-2; j++) {
if(thisWeekLotto[i] == thisWeekLotto[j]) {
System.out.print(", ");
}
}
} // 이번주 1등 당첨번호 출력

System.out.println();
System.out.println("+ 보너스 번호 : " + thisWeekLotto[6]);

// 보너스 번호 출력

int count = 0; // 일치하는 개수 담을 변수 count
for(int i = 0; i < thisWeekLotto.length-1; i++) {
for(int j = 0; j < myLotto.length; j++) {
if(thisWeekLotto[i] == myLotto[j]) {

// 나의 로또번호와 당첨번호 일치할 경우
count += 1; // count 값 1씩 증가
}
}
}

System.out.println();

System.out.println("일치하는 번호 개수 : " + count + "개");
switch (count) { // 일치하는 수에 따라 당첨판별
case 6: // 번호 6개 일치
System.out.println("1등에 당첨되셨습니다!");
break;
case 5: // 번호 5개 일치
int bonus = 0;
for(int i = 0; i < myLotto.length; i++) {
if(thisWeekLotto[6] == myLotto[i]) {

// 보너스 번호 조회
bonus += 1;
}
}
if(bonus == 1) { 

// 번호 5개 + 보너스 번호 당첨될 경우 2등
System.out.println("+ 보너스번호 1개 일치!");
System.out.println("2등에 당첨되셨습니다!");
} else {

// 보너스 번호 당첨 없이 번호 5개만 일치할 경우 3등
System.out.println("3등에 당첨되셨습니다!");
}
break;
case 4: // 번호 4개 일치
System.out.println("4등에 당첨되셨습니다!");
break;
case 3: // 번호 3개 일치
System.out.println("5등에 당첨되셨습니다!");
break;
default: // 그 외
System.out.println("낙첨되셨습니다! 다음 기회에...");
break;
}

}

}
  • 내가 푼 코드

 

import java.util.Arrays;

public class Test5 {

public static void main(String[] args) {
/*
* [ 문제 ] 로또 번호 생성 프로그램 만들기
* 1 ~ 45 사이의 중복되지 않는 난수 6개를 생성하여 배열에 저장한 후,
* 임의로 지정된 1등 당첨번호와 비교하여 일치하는 개수를 출력하는 프로그램
*
* [ 출력 결과(예시) ]
* 나의 로또 번호 : 10, 15, 30, 35, 37, 40
* 1등 당첨번호 : 1, 10, 15, 19, 30, 45
* 일치하는 번호 개수 : 3개
*
* [ 프로그램 작성 조건 ]
* 1. 난수 6개(로또번호)를 저장할 배열명 : myLotto
*    ⇒ 중복된 숫자가 저장되지 않도록 중복 제거 필수!
* 2. 1등 당첨번호를 저장할 배열명 : thisWeekLotto
*   (저장할 숫자 : 10, 19, 1, 30, 45, 15)
* 3. 화면에 출력할 나의 로또 번호와 1등 당첨번호는 오름차순 정렬한 뒤 출력
*    ⇒ Arrays.sort() 메서드 활용
* 4. 난수 발생은 Math.random() 메서드 사용
*/

int[] myLotto = new int[6]; // 번호 6개 저장할 배열
int[] thisWeekLotto = {10, 19, 1, 30, 45, 15};

// 1등 당첨번호

// 1. for문 사용하여 중복된 숫자 발생 시 제어변수 감소시키는 방법
// for(int i = 0; i < myLotto.length; i++) {
// // 난수 생성
// int rNum = (int)(Math.random() * 45 + 1);
//
// myLotto[i] = rNum; // 현재 배열 위치에 난수 저장
// // ⇒ 만약 중복된 숫자가 발견되면 i값을 1 감소시키므로
// //    다시 현재 위치에 새 난수를 저장하게 된다!
//
// // 기존에 저장된 myLotto 배열 내의 

// // 숫자와 새 난수가 중복인지 판별
// // ⇒ 안쪽 for문을 생성하여 생성된 난수를

// // 배열 내의 숫자와 비교
// for(int j = 0; j < i; j++) {

// // 최대 반복 횟수를 저장된 숫자 갯수로 지정
// if(rNum == myLotto[j]) {
// // 동일한(중복된) 번호가 존재할 경우

// // i 반복횟수 1 감소시킴
// i--;
// System.out.println("중복 번호 확인! - " + rNum);
// break;

// // 중복 체크 후 더 반복 진행 없이 안쪽 for문 종료
// }
// }
//
// }

// 2. while 문을 사용하여 저장되는 숫자 갯수를 체크하면서
// 중복된 숫자가 없을 때만 난수를 저장하는 방법
int count = 0; // 현재 저장된 난수 갯수 체크 변수
while(count < 6) { // 저장된 난수 갯수가 6개 미만일 동안 반복
int rNum = (int)(Math.random() * 45 + 1); // 난수 발생

boolean isDuplicate = false; // 중복 여부 체크 변수
// for문을 사용하여 중복 체크한 뒤

// 중복이면 isDuplicate = true 로 변경
for(int j = 0; j < count; j++) {

// 반복 횟수를 저장 숫자 갯수 -1 까지 지정
if(rNum == myLotto[j]) { // 중복 여부 체크
isDuplicate = true;
// System.out.println("중복 번호 확인! - " + rNum);
break;
}
}

// 중복 체크 변수가 false 일 때만 난수를 배열에 저장 후 카운트 증가시킴
if(!isDuplicate) {
myLotto[count] = rNum; // 난수 저장 후
count++; // 카운트 1 증가시킴
}

}

// ------ 로또 번호 저장 과정과 무관하게 동일한 부분 ------
// 배열에 저장된 번호 정렬
Arrays.sort(myLotto);
Arrays.sort(thisWeekLotto);

// 자신의 로또 번호 출력
System.out.print("나의 로또 번호 : ");
for(int i = 0; i < myLotto.length; i++) {
System.out.print(myLotto[i] + " ");
}
System.out.println();

// 1등 당첨번호 출력
System.out.print("1등 당첨번호 : ");
for(int i = 0; i < thisWeekLotto.length; i++) {
System.out.print(thisWeekLotto[i] + " ");
}
System.out.println();


// 일치하는 번호 갯수 카운팅 후 출력
int sameCount = 0;

// 자신의 로또 번호와 1등 당첨번호를

// 각각 비교하여 같으면 카운팅 증가시킴
for(int i = 0; i < myLotto.length; i++) {
for(int j = 0; j < thisWeekLotto.length; j++) {
if(myLotto[i] == thisWeekLotto[j]) {
sameCount++;
}
}
}

System.out.println("일치하는 번호 개수 : "+ sameCount +"개");

}

}
  • 선생님 코드

앞으로 배울 Collection 을 위해 로또 숙제 내줌!

⇒ Collection 쓰면 중복판별하는 코드 한 줄이면 끝남!

 

728x90