-
과제7. 로또 당첨 프로그램백엔드 스쿨/Java 2023. 11. 13. 17:54
목적
Scanner의 입력함수와 조건문 및 반복문과 배열을 통한 로또 당첨 로직 작성
로또는 1-45개의 숫자 사이의 값중 6개를 맞추면 당첨되는 복권
로또의 개수를 구매하고(구매수량 입력), 당첨번호를 생성한다.
이후, 구매한 로또의 당첨번호를 판단하 는 프로그램을 작성
1. 로또 구매 수량 입력
2. 입력한 개수만큼의 로또 개수 생성
3. 로또 당첨 번호 생성(숫자값은 중복 배제 및 정렬해서 표시)
4. 당첨 번호와 구매 로또 비교하여 숫자 일치 여부 판단
5. Collections.shuffle 함수 사용 금지!(shuffle함수는 과제의 취지와 맞지 않기 때문에, 사용시 0
콘솔 예시 코드 구상
1. 숫자를 입력받은 만큼 A(1) ~ J(10) 까지 로또 묶음을 생성해야함.
2차원 배열이 적당하다고 생각됨. number[n][6] 의 형태
2. Random 으로 1-45 사이의 난수를 생성. 차례대로 난수를 생성하되 이전에 생성된 난수와 같은 수가 있는 경우 다시 난수를 생성해서 다른 수를 입력하도록 한다.
3. 모든 로또가 생성이 완료되면 당첨번호를 같은 방식으로 생성한다.
따라서 당첨 번호의 배열도 필요함. 1차원 배열로 생성
로또 묶음과 같이 생성하는 방법도 있지만 헷갈릴 수 있기 때문에 따로 배열을 작성.
4. 일치하는 번호가 몇개인지 확인
오름차순 정렬이므로 당첨번호보다 비교하는 번호가 더 작은 숫자이면 해당 번호는 일치하는 번호가 없으므로 다음 번호를 비교한다.
import java.util.Arrays; import java.util.Random; import java.util.Scanner; public class JavaStudy07{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); Random rd = new Random(); System.out.println("[로또 당첨 프로그램]\n"); System.out.print("로또 개수를 입력해 주세요.(숫자 1 ~ 10)"); int totalNumber = sc.nextInt(); // 총 갯수를 입력 sc.nextLine(); int lottery[][] = new int[totalNumber][6]; for(int i=0;i<totalNumber;i++) { int j = 0; // while문을 사용하기 위해 j 변수를 선언. while(j<6) { int dupCounter = 0; //중복 카운터를 초기화 lottery[i][j] = rd.nextInt(45)+1; // 난수를 발생시켜 현재의 행과 열에 입력. if(j==0) { j++; continue; //첫 열의 경우 바로 j 값을 증가 시킨 뒤 continue를 통해 다음 반복문으로 이동 } for(int k=0;k<j;k++) if(lottery[i][k] == lottery[i][j]) dupCounter++; // 기존의 배열 내용과 같은 숫자가 있는경우 중복 카운터를 상승. if(dupCounter==0) j++; // 중복 카운터가 0인경우 기존의 배열과 같은 숫자가 없다는 뜻이므로 중복이 없는 숫자를 저장하고 다음 열로 이동하기 위해 j값을 증가 }// 총 6개의 숫자가 저장되고 나면 j값이 6이 되므로 while에서 자동으로 빠져나온다. Arrays.sort(lottery[i]); // Array를 이용해 i번째 행을 오름차순 정렬한다. System.out.printf("%c ",'A'+i); // 문자 A에 i값을 더해 알파벳 순서대로 출력 for(int k=0;k<6;k++) { System.out.printf("%02d",lottery[i][k]); // 배열의 i행을 순서대로 출력 0을 포함하는 2자리 숫자로 출력 if(k<5) System.out.print(", "); // 0~4까지의 경우 쉼표와 공백을 표시 } System.out.println(); //줄바꿈 } int winNum[] = new int[6]; // 당첨 번호를 저장하기 위한 배열을 생성 for(int i=0;i<6;i++) { int dupCounter = 0; winNum[i] = rd.nextInt(45)+1; if(i==0) continue; for(int j=0;j<i;j++) if(winNum[j] == winNum[i]) dupCounter++; if(dupCounter!=0) i--; } // 당첨번호를 생성하여 저장 Arrays.sort(winNum); // 당첨번호를 오름차순 정렬 System.out.println(); System.out.println("[로또 발표]"); System.out.print(" "); for(int i=0;i<6;i++) { System.out.printf("%02d",winNum[i]); if(i<5) System.out.print(", "); } // 당첨번호를 출력 System.out.println(); System.out.print("\n[내 로또 결과]\n"); for(int i=0;i<totalNumber;i++) { int winCounter = 0; // 일치하는 숫자의 갯수를 저장하는 카운터 for(int j=0;j<6;j++) for(int k=0;k<6;k++) { if(lottery[i][j]<winNum[k]) // 현재 비교하려는 숫자가 현재 비교하려는 당첨번호보다 작다면 이후의 당첨번호와는 비교할 필요가 없으므로 break를 통해 반복문을 종료. break; else if(lottery[i][j]==winNum[k]) { // 마찬가지로 숫자가 당첨인 경우도 나머지 당첨번호와 비교할 필요가 없으므로 break. winCounter++; break; } } // 당첨 번호의 갯수를 카운트 System.out.printf("%c ",'A'+i); for(int j=0;j<6;j++) { System.out.printf("%02d",lottery[i][j]); if(j<5) System.out.print(", "); } System.out.printf(" => %d개 일치", winCounter); // 당첨번호 갯수를 출력 System.out.println(); //줄바꿈 } } }
'백엔드 스쿨 > Java' 카테고리의 다른 글
자료 구조 - Stack (0) 2023.11.16 과제8. 연소득 과세금액 계산 프로그램 (1) 2023.11.13 과제6. 가상 선거 및 당선 시뮬레이션 프로그램 (0) 2023.11.12 과제5. 달력 출력 프로그램 (0) 2023.11.12 과제4. 주민등록번호 생성 프로그램 (1) 2023.11.12