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에 다 있는거 같다.