java 11일차 - 로또

KHLee·2023년 3월 9일

자바수업

목록 보기
16/46


UML을 기반으로 lotto 프로그램을 작성 하시오
1. 변수 설명
winningNum: HashSet
당참 번호 1~25까지의 숫자 중 3개를 선정
prizeMoney: double
당첨 금액 랜덤하게 생성 ( 1 ~ 2000000000)
2 함수 설명
makeWinningNumberMoney(): void
당첨 번호와 당첨금을 생성 한다.
checkRanking(myNum: ArrayList): int
본인이 입력한 숫자 3개를 argument로 입력 하면
몇개가 일치한지를 check 한후 등수를 리턴
등수는 자유롭게 설정
prizeMoney(grade: int): double
등수 정보를 입력 하면 당첨 금액을 리턴
당첨 금액 비율은 자유롭게 설정


헷갈렸던 부분!

Lotto class 구현 부분

- class변수, 지역변수 구분.

class를 처음 생성하면서 prizeMoney와 winningNum을 선언했지만, 하단에서 다시한번 double prizeMoney/ HashSet winningNum을 선언해서 에러가 발생함.
arr.size를 이용하여 for문 말고 while문을 돌릴 수도 있다.

- checkRanking(ArrayList<> myNum)을 구현시

ArrayList와 HashSet을 비교해야 하는데 어떻게 할지 고민. for문을 돌리며 HashSet.contains(ArrayList.get[i]) 비슷하게 구현하려고 했는데 안해봄.
그냥 for Each로 element를 하나씩 빼오면서 HashSet.contains를 true false 비교함. 그리고 true시 cnt를 ++하고 grade를 정함.
prizeMoney를 구현할 때는 전역변수 지역변수로 인해서 생긴 문제 말고 없었음.

App 구현 부분

- Lotto에 있는 함수를 사용해야하는데 어떻게 구하지??

DAO dao = new DAO로 함수를 썼던 것 처럼, 직접적으로 사용하지는 않겠지만 Lotto lt = new Lotto()로 선언을 먼저 해줌.
이어서 random하게 당첨 번호와 상금을 정하였다.(리턴값이 없는 void. 나중에 비교대상으로 사용됨).
sc로 출력을 받아서 번호를 받을 myNum 변수를 ArrayList로 선언했고 세개의 수를 입력받아서 대입.
1-25사이 수가 아닌 경우 오류를 내서 종료를 시켰지만, 문자가 들어올 때 예외처리는 하지 못했다.
lt 클래스를 호출하고 checkRanking(myNum) 메서드를 호출하여 grade를 받아서 int grade에 넣어주었고, lt 클래스를 호출하여 prizeMoney() 메서드를 사용하였다.


  package ws0309;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Random;

public class Lotto {
	private HashSet<Integer> winningNum = new HashSet<Integer>();
	private double prizeMoney;
	
	public void makeWinningNumberMoney() {
		Random r = new Random();
		while (winningNum.size() < 3) {
			winningNum.add(r.nextInt(25) + 1);
		}
		prizeMoney = (r.nextDouble() * 2000000000) + 1;
		System.out.printf("정답 : %s, 상금 : %10.2f\n", winningNum, prizeMoney);
	}
	
	public int checkRanking(ArrayList<Integer> myNum) {
		int cnt = 0;
		int grade = 0;
		for (int num : myNum) {
			if(winningNum.contains(num) == true) {
				cnt ++;
			}
		}
		if (cnt == 3) {
			grade = 1;
		}
		if (cnt == 2) {
			grade = 2;
		}
		if (cnt == 1) {
			grade = 3;
		}
		return grade;
	}

	public double prizeMoney(int grade) {
		double result = 0.0;
		switch (grade) {
		case 1 :
			result = prizeMoney * 0.7;
			System.out.printf("%d등! %10.2f원 당첨", grade, result);
			return result;
		case 2 :
			result = prizeMoney * 0.2;
			System.out.printf("%d등! %10.2f원 당첨", grade, result);
			return result;
		case 3 :
			result = prizeMoney * 0.1;
			System.out.printf("%d등! %10.2f원 당첨", grade, result);
			return result;
		default :
			result = 0.0;
			System.out.println("꽝");
			return result;
		}
	}
}

이하 복기

package lotto;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Random;

public class Lotto {
	private HashSet<Integer> winningNum;
	private double prizeMoney;
	
	public double getPrizeMoney() {
		return prizeMoney;
	}
	public Lotto() {
		winningNum = new HashSet<Integer>();
	}
	public void makeWinningNumberMoney() {
		//번호 생성, 당첨금 생성
		Random r  = new Random();
		prizeMoney = r.nextInt(2000000000) + 1;
		while (winningNum.size() < 3) {
			winningNum.add(r.nextInt(25) + 1);
		}
		System.out.println(prizeMoney);
		System.out.println(winningNum.toString());
	}
	//생성자 안에 넣어서 class를 호출하면 실행되게 할 수도 있다.
	//그러나 게임을 여러번 하고 싶을 경우를 위해 함수호출을 생성자가 아닌
	//따로 호출하게 밖으로 뺐다.
	public int checkRanking(ArrayList<Integer> myNum) throws Exception {
		int grade = 0;
		int cnt = 0;
		// 5 7 9
		for(int num : myNum) {
			// 5 7 10
			for(int prizeNum : winningNum) {
				if (num == prizeNum) {
					cnt++;					
				};

			}
		}
		switch (cnt) {
		case 3 : grade = 1; break;
		case 2 : grade = 2; break;
		case 1 : grade = 3; break;
		default : throw new Exception("꽝");
		}
		return grade;
	}
	
	public double prizeMoney(int grade) {
		double pMoney = 0.0;
		switch(grade) {
		case 1 : pMoney = prizeMoney * 0.7; break;
		case 2 : pMoney = prizeMoney * 0.2; break;
		case 3 : pMoney = prizeMoney * 0.1; break;
		default : pMoney = 0.0;
		}
		return pMoney;
	}
}
package lotto;

import java.util.ArrayList;
import java.util.Scanner;

public class App {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Lotto lotto = new Lotto();
		int grade = 0;
		while(true) {
			System.out.println("Input cmd..(q.s.c.p)");
			String cmd = sc.next();
			if(cmd.equals("q")) {
				break;
			}else if(cmd.equals("s")) {
				System.out.println("Make Number and Prize Money");
				lotto.makeWinningNumberMoney();
			}else if(cmd.equals("c")) {
				System.out.println("Input 3 number :");
				int num1 = Integer.parseInt(sc.next());
				int num2 = Integer.parseInt(sc.next());
				int num3 = Integer.parseInt(sc.next());
				ArrayList<Integer> nums = new ArrayList<Integer>();
				nums.add(num1);
				nums.add(num2);
				nums.add(num3);
				try {
					grade = lotto.checkRanking(nums);
				} catch (Exception e) {
					System.out.println(e.getMessage());
					continue;//아래 코드를 다 무시하고 다시 while루프 처음으로 돌아감.
					//continue로 while루프로 제어할 수 있다.
				}
				System.out.println(grade);
			}else if(cmd.equals("p")) {
				System.out.printf("총 당청금 %4.0f\n",lotto.getPrizeMoney());
				System.out.printf("당신의 등수 %d\n",grade);
				System.out.printf("당신의 당첨금 %4.0f\n",lotto.prizeMoney(grade));
			}
		}
		sc.close();
	}

}
profile
안녕하세요

0개의 댓글