[Java] HashSet을 이용한 로또 판매 프로그램
22.06.23. 고급자바 숙제.
Q. 로또를 구매하는 프로그램 작성하기.
사용자는 로또를 구매할 때 구매할 금액을 입력하고
입력한 금액에 맞게 로또번호를 출력한다.
(단, 로또 한장의 금액은 1000원이며 최대 100장까지만 구입할 수 있고,
거스름돈도 계산하여 출력한다.)
==========================
Lotto 프로그램
--------------------------
1. Lotto 구입
2. 프로그램 종료
==========================
메뉴선택 : 1 <-- 입력
Lotto 구입 시작
(1000원에 로또번호 하나입니다.)
금액 입력 : 2500 <-- 입력
행운의 로또번호는 아래와 같습니다.
로또번호1 : 2,3,4,5,6,7
로또번호2 : 20,21,22,23,24,25
받은 금액은 2500원이고 거스름돈은 500원입니다.
==========================
Lotto 프로그램
--------------------------
1. Lotto 구입
2. 프로그램 종료
==========================
메뉴선택 : 1 <-- 입력
Lotto 구입 시작
(1000원에 로또번호 하나입니다.)
금액 입력 : 900 <-- 입력
입력 금액이 너무 적습니다. 로또번호 구입 실패!!!
==========================
Lotto 프로그램
--------------------------
1. Lotto 구입
2. 프로그램 종료
==========================
메뉴선택 : 1 <-- 입력
Lotto 구입 시작
(1000원에 로또번호 하나입니다.)
금액 입력 : 101000 <-- 입력
입력 금액이 너무 많습니다. 로또번호 구입 실패!!!
==========================
Lotto 프로그램
--------------------------
1. Lotto 구입
2. 프로그램 종료
==========================
메뉴선택 : 2 <-- 입력
감사합니다
A. 내멋대로의 답.
풀기 전에 계획을 먼저 세워보기로 했다. 그리고 메모장에 끄적거린 결과.
1. 메인 화면 메소드
1-1. 시스템 진입 화면 출력
1-1-1. 1번 입력 시, 결제 메소드로 진입.
1-1-2. 2번 입력 시, '프로그램을 종료합니다.' 출력 후 종료.
2. 결제 메소드
2-1. 구매할 금액을 입력 받는다.
2-1-1. 금액이 100000원 초과인 경우 "결제 가능한 금액을 초과하였습니다." 출력하고 2에 재진입.
2-1-2. 금액이 100000원 이하인 경우 결제 금액을 1000으로 나누어 횟수 구하고 2-2로.
2-1-3. 금액이 1000원 미만인 경우 "결제 금액이 최소 금액보다 작습니다." 출력하고 2에 재진입.
2-2. 결제가 가능할 경우 거스름돈과 게임가능 횟수 산출
3. 로또 번호 출력 메소드
3-1. '2-2'에서 산출한 게임 가능 횟수만큼 로또 번호를 생성한다.
3-2. 위의 내용을 출력한다.
3-3. 1번으로 돌아간다.
package homework;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
public class Lotto {
public static void main(String[] args) {
Lotto lotto=new Lotto();
lotto.menu(); //메뉴 메소드 호출
}
public void menu() { //메뉴 메소드
Lotto lotto=new Lotto();
System.out.println("====================");
System.out.println(" Lotto 프로그램");
System.out.println("--------------------");
System.out.println("1. Lotto 구입");
System.out.println("2. 프로그램 종료");
System.out.println("====================");
System.out.print("메뉴 선택: ");
Scanner sc=new Scanner(System.in);
int choice=sc.nextInt();
if(choice==1) {
System.out.println("Lotto 구입 시작");
System.out.println("(1000원에 로또 번호 하나입니다.)");
//구입 메서드 호출.
lotto.buyLotto();
}else if(choice==2) {
//프로그램 종료 선택
System.out.println("이용해주셔서 감사합니다.");
System.out.println("프로그램을 종료합니다.");
}else {
//1과 2 이외의 입력이 있을 때.
System.out.println("잘못된 입력입니다. 다시 입력해주세요.");
menu();//메뉴 재진입
}
}
public void buyLotto() {
Scanner sc=new Scanner(System.in);
System.out.print("금액 입력: ");
int deposit=sc.nextInt(); //구매 금액 변수
if(deposit<1000) { //입력된 금액이 1000원보다 작은 경우
System.out.println("입력한 금액이 1게임의 가격보다 작습니다. ");
System.out.println("-----------------------------");
//프로그램을 멈추지 않고 사용자가 선택하도록 함.
System.out.println("1. Lotto 구입");
System.out.println("2. 프로그램 종료");
System.out.println("====================");
int next=sc.nextInt();
if(next==1) { //1번을 입력할 경우 구입으로 되돌아감.
buyLotto();
}else if(next==2) { //2번을 입력할 경우 프로그램 종료.
System.out.println("이용해주셔서 감사합니다.");
System.out.println("프로그램을 종료합니다.");
}else { //1과 2 이외의 다른 입력 발생 시 메뉴로 진입.
System.out.println("잘못된 입력입니다. 메뉴로 이동합니다.");
menu();
}
}else if(deposit<=100000) { //1000≤(입력 금액)≤100000인 경우
int times=(int) (deposit/1000); //(게임 횟수)=(입력 금액)÷(1회 게임 금액)
int change=deposit-1000*times; //(잔돈)=(입력금액)-{(게임횟수)×(1회 게임 금액)}
//times만큼 for문 돌려서 makeNumbers 실행하기
for(int i=0;i<times;i++) { //게임 횟수만큼 로또번호 생성
System.out.println((i+1)+"번째 로또 번호입니다.");
//i가 0부터 시작하기 때문에 1을 더한다.
makeNumbers(); //로또번호 생성&출력 메서드 호출
}
//입력 금액과 거스름돈 출력
System.out.println("입력한 금액은 "+deposit+"원");
System.out.println("거스름돈은 "+change+"원입니다.");
System.out.println("이용해주셔서 감사합니다. 메인으로 이동합니다.");
menu();
}else { //입력 금액이 100000을 초과한 경우 구매 불가능.
System.out.println("입력한 금액이 1회 구매 가능 금액보다 큽니다. 다시 입력하세요.");
buyLotto(); //입력 금액을 다시 받도록 돌아간다.
}
}
public void makeNumbers() { //로또번호 생성&출력 메서드
HashSet <Integer> lottoNums = new HashSet<Integer>();
//로또 번호는 중복될 수 없기 때문에 중복을 막기 위해
//HashSet을 이용하여 로또 번호를 생성한다.
while(lottoNums.size()<6){ //HashSet의 데이터 개수가 6개가 될 때까지 난수가 저장된다.
lottoNums.add((int)(Math.random()*45+1));
//Math.random()메소드는 0~0.99999…의 난수를 생성한다.
//(Double타입이므로 사용에 주의.
//최솟값 m, 최댓값 M일 때의 Math.random()사용법
// Math.random()*(M-m+1)+m
}
//위에서 생성한 번호들을 list에 추가하여 출력.
ArrayList<Integer>lottoList=new ArrayList<Integer>(lottoNums);
System.out.println(lottoList);
}
}