Lotto 프로그램

HC·2022년 8월 25일
0

LOTTO 프로그램 바꿔보기

이번주 1등 당첨번호를 뽑아놓고 로또 구매를 한 뒤,
당첨 등수를 확인하는 프로그램
수업시간 내용 활용하기
Set 사용 / List<>(Set) 사용


import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Scanner;

public class Lotto3 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		HashSet<Integer> lotto = new HashSet<Integer>();
		
		power:
		while(true) {
			HashMap<Integer, int[]> buyLotto = new HashMap<Integer, int[]>();
			HashSet<Integer> lottoWeek = new HashSet<Integer>();
			while(lottoWeek.size() < 6) {
				lottoWeek.add((int)(Math.random()*(45)+1));
			}
			
			System.out.println("========================================");
			System.out.println("             Lotto 프로그램");
			System.out.println("이번 주 1등 당첨 번호 : " + lottoWeek);
			System.out.println("----------------------------------------");
			System.out.println("              1. Lotto 구입");
			System.out.println("              2. 프로그램 종료");
			System.out.println("========================================");
			System.out.print("메뉴 선택 >> ");
			switch(sc.nextInt()) {
			case 1:
				System.out.println("구매하실 금액을 입력해주세요.");
				System.out.println("1게임 1000원");
				System.out.print("입력 : ");
				int money = sc.nextInt();
				System.out.println("----------------------------------------------------------------------------------------");
				if(money < 1000) {
					System.out.println("금액이 너무 적습니다.");
				}else if(money > 10000) {
					System.out.println("금액이 너무 큽니다.");
				}else {
					for(int i = 0; i < (money/1000) ; i++) {
						int[] number = new int[6];//담아놓을 배열.
						while(lotto.size()<6) {
							lotto.add((int)(Math.random()*(45)+1));
						}
						//Set의 데이터를 리스트 -> 배열에 담아 데이터 보존하기.
						ArrayList<Integer> data = new ArrayList<Integer>(lotto);
						for(int j = 0 ; j < lotto.size(); j++) { 
							number[j] = data.get(j);
						}
						
						buyLotto.put(i, number);
						lotto.clear();
						
					}
					for(int i = 0; i < (money/1000); i++) {
						int count = 0; //일치하는 수 카운트
						int[] comparison = new int[6]; //비교하기 위해서 배열에 다시 담기.
						comparison = buyLotto.get(i);
						
						System.out.print("나의 " + (i+1)+"번째 게임 : " + 
											Arrays.toString(buyLotto.get(i)) + "\t");
						//비교 시작
						for(int j = 0; j < 6; j++) {
							if(lottoWeek.contains(comparison[j])) {
								count++;
							}
						}
						//결과
						System.out.print("일치하는 수  : " + count + "\t");
						if(count == 3) {
							System.out.println("축하합니다 ! 5등 입니다. 당첨금 : 5천원");
						}else if(count == 4) {
							System.out.println("축하합니다 ! 4등 입니다. 당첨금 : 5만원");
						}else if(count == 5) {
							System.out.println("축하합니다 ! 3등 입니다. 당첨금 100만원");
						}else if(count == 6) {
							System.out.println("축하합니다 ! 1등 입니다. 당첨금 20억원");
						}else {
							System.out.println("꽝 입니다!");
						}
						System.out.println("----------------------------------------------------------------------------------------");
					}
				}
				break;
			case 2: 
				System.out.println("프로그램을 종료합니다. 감사합니다.");
				break power;
			default: 
				break;
			}
		}//while
	}
}

실제로 로또를 사면 종이를 받듯이, 몇개를 사던 상관없이 데이터를 저장해보고 싶었다.

Set과 List만 사용하면 clear()를 해야해서 데이터를 저장을 따로 할 수가 없길래
데이터를 Set -> List -> int[] 순서로 옮겨담아 저장했다.
이런식으로 하니까 Set과 List를 clear하면서 재사용해도 이전에 뽑힌 번호들을 저장하고 저장된 데이터를 활용할 수 있었다.

Lotto 프로그램에선 굳이 이렇게 하지않아도 Set을 List에 담기만 해도 되는데,
그런식으로 해보니까 5개를 사면 5개를 산 뒤, 당첨여부를 확인해보는게 아니라
1개를 사서 확인하고 버리는 행위를 5번 반복하는 거라 맘에 들지 않았다.

원래 해보고 싶었던 방식

처음에는 for문을 이용해서 동적으로 List 변수를 선언해서
10개를 사면 List1~10까지 생성되어 번호를 저장하는 방식으로 해보고 싶었는데,
찾아보니 Java에서는 동적으로 변수를 선언할 수 없다고 한다.
그러나 Python에는 가능하다.
예를 들어 사용자가 입력하는 수에 따라 변수명을 number(i) = 1; 이런식으로 할 수 있다.

for(조건){
	globals()['number{}'.format(i)] = 1
}

여기서 조건에 i가 1부터 10까지 증가하면,
number1, number2, ... number10 이라는 변수들이 생성된다.

항상 '이런식으로 하면 편할텐데..' 하는 방식들은 Python에 다 있는거 같다.

profile
오류보고

0개의 댓글