자바프로그래밍

[JAVA] 로또 프로그램(컬렉션 사용)

제주도소년 2020. 4. 26. 22:18

문제 : 자바로 로또 프로그램을 작성하시오. ( 컬렉션을 사용 )

[ 프로그램의 기능 ]

1. 로또 생성

2. 당첨 번호 생성

3. 로또 결과 확인

 

로또는 1부터 45까지의 랜덤 숫자이며 총 6자리 이다.

당첨번호는 다른 하나의 보너스 번호를 가진다.

 

로또 등수는 아래와 같다.

  1등 6개 일치 
  2등 5개 + 보너스번호 일치 
  3등 5개 일치 
  4등 4개 일치 
  5등 3개 일치 

 

[ 클래스 구성 ]

Lotto.java

LottoProgram.java

 


Lotto.java

- 6개의 번호를 담을 수 있는 ArrayList 가 존재한다.

- 6개의 정수를 담아야 하기 때문에 기본 타입인 int 타입을 객체로 만들어서 ArrayList 에 추가해야 한다.

더보기
import java.util.*;

public class Lotto {
	private ArrayList<Integer> lotto;
	
	public Lotto(ArrayList<Integer> lotto) {
		this.lotto = lotto;
	}

	public ArrayList<Integer> getLotto() {
		return lotto;
	}

	public void setLotto(ArrayList<Integer> lotto) {
		this.lotto = lotto;
	}

	@Override
	public String toString() {
		String info = "";

		for(Integer a : lotto) {
			info += " "+a;
		}
		return info;
	}
}

LottoProgram.java

- Lotto 를 담을 수 있는 ArrayList lotto 가 존재한다.

- 당첨번호만 담을 수 있는 ArrayList winningLotto 가 존재한다.

- 보너스 번호를 담을 수 있는 bonusNumber 가 존재한다.

- 번호를 생성, 당첨 결과를 확인 할 수 있다.

더보기
public class LottoProgram {
	public static final int LOTTO_NUMBER_MAX = 5;
	public static final int BONUS_NUMBER_INDEX = 6;
	
	//1등 부터 5등까지
	public static final int THE_SIXTH = 6;
	public static final int THE_FIVE = 5;
	public static final int THE_FOUR = 4;
	public static final int THE_THREE = 3;
	
	
	private Iterator itr;
	
	private ArrayList<Lotto> lotto;
	private ArrayList<Integer> winningLotto;
	private Integer bonusNumber;
	
	
	public LottoProgram() {
		lotto = new ArrayList<Lotto>();
	}

	public ArrayList<Lotto> getLotto() {
		return lotto;
	}
	public void setLotto(ArrayList<Lotto> lotto) {
		this.lotto = lotto;
	}
	public ArrayList<Integer> getWinningLotto() {
		return winningLotto;
	}
	public void setWinningLotto(ArrayList<Integer> winningLotto) {
		this.winningLotto = winningLotto;
	}
	public Integer getBonusNumber() {
		return bonusNumber;
	}
	public void setBonusNumber(Integer bonusNumber) {
		this.bonusNumber = bonusNumber;
	}

	//로또 번호 생성
	private ArrayList<Integer> lottoNumberCreate() {
		//중복없이 생성하고 정렬이 되어 있어야 함
		HashSet<Integer> temp = new HashSet<Integer>();
		
		while(temp.size() <= LOTTO_NUMBER_MAX) {
			//auto boxing
			temp.add((int) (Math.random() * 45 ) + 1);
		}
		
		//리스트로 만들어서 정렬시킴
	    ArrayList<Integer> list = new ArrayList<Integer>(temp);
	    Collections.sort(list);
	    
	    return list;
	}
	
	//당첨번호 생성
	private void lottoResultNumberCreate() {
		System.out.println("당첨번호를 추첨 합니다");
		winningLotto = lottoNumberCreate();	

		do {
			bonusNumber = (int) (Math.random() * 45 ) + 1;
			//번호가 존재 하지 않으면 추가
			if(!winningLotto.contains(bonusNumber)) {
				winningLotto.add(bonusNumber);
			}
			
		} while(winningLotto.size() == BONUS_NUMBER_INDEX);
		
		System.out.println("당첨 번호 : " + winningLotto);
		System.out.println("마지막 번호가 보너스 번호입니다.");
	}
	
	//로또 사는거
	public void lottoBuy() {
		Scanner kb = new Scanner(System.in);
		System.out.printf("몇 개를 살까요 ?  : ");
		int num = kb.nextInt();
		
		for(int i = 0; i < num; i++) {
			lotto.add( new Lotto(lottoNumberCreate()) );
		}
	}
	
	//모든 로또 출력
	public void printAll() {
		int i = 1;
		itr = lotto.iterator();
		
		while(itr.hasNext()) {
			System.out.println(i+"회 번호 : "+itr.next());
			i++;
		}
	}
	//당첨 결과
	public void result() {
		winningLotto.remove(BONUS_NUMBER_INDEX);
		
		itr = lotto.iterator();
		int i = 1;
		while(itr.hasNext()) {
			Lotto temp = (Lotto) itr.next();
			ArrayList<Integer> lottoTemp = temp.getLotto();
			
			lottoTemp.retainAll(winningLotto);
			
			String result = rank(lottoTemp);
			
			System.out.print(i+"회 게임 결과 : " + result + "\t");
			System.out.println("일치 번호 -> " +lottoTemp);
			i++;
		}
	}
	//등수
	private String rank(ArrayList<Integer> temp) {
		/*
		 	1등 6개 일치
		 	2등 5개 + 보너스번호 일치
		 	3등 5개 일치
		 	4등 4개 일치
		 	5등 3개 일치
		*/
		
		int count = temp.size();
		
		if(count == THE_SIXTH) {
			return "1등";
		} else if(count == THE_FIVE && temp.contains(bonusNumber)) {
			return "2등";
		} else if(count == THE_FIVE) {
			return "3등";
		} else if( count == THE_FOUR) {
			return "4등";
		} else if( count == THE_THREE) {
			return "5등";
		} else {
			return "꽝";
		}
	}

	//Process
	public void process() {
		//1. 복권 몇 개를 구매할 건가(구매한 복권 다 출력함)
		lottoBuy();
		printAll();
		//2. 당첨번호 추첨
		lottoResultNumberCreate();
		//3. 게임결과 확인
		result();
	}
}

'자바프로그래밍' 카테고리의 다른 글

파일 입출력(IO패키지)  (0) 2020.05.28
[JAVA] 예외처리  (0) 2020.04.29
List  (0) 2020.04.23
컬렉션  (0) 2020.04.23
Wrapper class  (0) 2020.04.23