Java

[Java] HashSet을 이용한 로또 판매 프로그램

Empty_Bottle 2022. 6. 23. 19:38

아마도 능소화?

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);
	}
	

}