[필기정리]Day15 - Lotto생성기 및 숫자야구게임 문제

SW/Java

2020. 6. 30. 11:59

Q. Lotto 자동생성기를 만드시오.

A. 강사님의 답

import java.util.Random;

class Lotto
{
	private int[] lotto;
	private Random random; 
	private final int MAX = 6; 
	
	Lotto()
	{
		lotto = new int[MAX];
		random = new Random();
	}
	public void execute()
	{
		makeLotto(); 
		sortLotto(); 
		printLotto();		 
	}
	public boolean chkNum(int idx)
	{
		for(int i=0;i<idx;i++)
		{			
			if(lotto[idx]==lotto[i])
			{
				return false;
			}
		}
		return true;
	}

	public void makeLotto()
	{
        for(int i=0;i<lotto.length;i++)
		{
			lotto[i] = random.nextInt(45)+1;
			if( !chkNum(i) )
			{
				i--;
			}
		}
	}

	public void sortLotto()
	{
		int tmp=0;
		for(int i=0;i<lotto.length-1;i++)
		{
			for(int j=i+1;j<lotto.length;j++)
			{
				if(lotto[i]>lotto[j])
				{
					tmp = lotto[i];
					lotto[i] = lotto[j];
					lotto[j] = tmp;
				}
			}
		}
	}

	public void printLotto()
	{
		for(int i=0;i<lotto.length;i++)
			System.out.print(lotto[i] + " ");
		System.out.println();
	}
}
	
class LottoMain3
{
	public static void main(String[] args)
	{	
		Lotto lotto = new Lotto();
		for(int i=0;i<5;i++)
			lotto.execute();
	}
}

A. 내가 생각한 답

import java.util.Random;
class LottoMain
{
	public static void main(String[] args)
	{
		Random rand = new Random();
		int [] arr = new int[6];
		int num =0;
	
		System.out.println("로또 번호 자동 생성기입니다.");
		//난수를 배열에 넣는 로직
		for(int i=0;i<arr.length;i++)
		{
			boolean flag = true;
			num=rand.nextInt(45)+1;
			for(int j=0;j<arr.length;j++) //같은 숫자가 있는지 찾는 로직
			{
				if(arr[j]==num)
				{
					flag = false;
					break;
				}	
			}
			if(flag) arr[i]=num;
			else i--;	
		}
		//정렬하는 로직
		int temp=0;
		for(int i=0;i<arr.length-1;i++)
		{
			for(int j=i+1;j<arr.length;j++)
			{
				if(arr[i]>arr[j])
				{
					temp=arr[i];
					arr[i]=arr[j];
					arr[j]=temp;
				}
			}
		}	
		//출력하는 로직
		for(int i=0;i<arr.length;i++) System.out.print(arr[i]+"\t");
	}
}

 

Q. 로또 자동생성기를 2차원 배열을 통해 5줄짜리로 출력하시오.

A. 강사님의 답

import java.util.Random;

class Lotto
{
	private int[][] lotto;
	private Random random;
	private final int MAX = 6;
	private int numOfLotto = 5; //로또의 갯수
	
	Lotto()
	{
		lotto = new int[numOfLotto][MAX];
		random = new Random();
	}
	public void execute()
	{
		makeLottos();
		sortLottos();
		printLottos();		
	}
	public void makeLottos()
	{
		for(int i=0;i<numOfLotto;i++)
		{
			makeLotto(lotto[i]);
		}
	}
	public void sortLottos()
	{
		for(int i=0;i<numOfLotto;i++)
		{
			sortLotto(lotto[i]);
		}
	}
	public void printLottos()
	{
		for(int i=0;i<numOfLotto;i++)
		{
			printLotto(lotto[i]);
		}
	}	
	public boolean chkNum(int idx, int[] lotto)
	{
		for(int i=0;i<idx;i++)
		{			
			if(lotto[idx]==lotto[i])
			{
				return false;
			}
		}
		return true;
	}

	public void makeLotto(int[] lotto)
	{
		int tmp=0;
		for(int i=0;i<lotto.length;i++)
		{
			lotto[i] = random.nextInt(45)+1;
			if( !chkNum(i, lotto) )
			{
				i--;
			}
		}
	}

	public void sortLotto(int[] lotto)
	{
		int tmp=0;
		for(int i=0;i<lotto.length-1;i++)
		{
			for(int j=i+1;j<lotto.length;j++)
			{
				if(lotto[i]>lotto[j])
				{
					tmp = lotto[i];
					lotto[i] = lotto[j];
					lotto[j] = tmp;
				}
			}
		}
	}

	public void printLotto(int[] lotto)
	{
		for(int i=0;i<lotto.length;i++)
			System.out.print(lotto[i] + " ");
		System.out.println();
	}
}
	
class LottoMain4
{
	public static void main(String[] args)
	{	
		Lotto lotto = new Lotto();
		lotto.execute();
	}
}

 

Q. 숫자야구게임 만들어보기

   프로그램이 만든 난수를 내가 맞춰보는 게임을 만드는 것

   유저한테 편한 프로그램을 만드는 것 ex) 567 엔터

   자리와 숫자를 전부 맞춰 홈런을 쳤을 때는 cnt로 "몇번 만에 홈런을 치셨습니다."

   숫자와 자리를 맞추면 1스트라이크, 숫자만 맞춘 경우 1볼로 한다.

 

A.  강사님의 답

import java.util.Random;

public class Baseball {               // 기능
	public static final int MAX = 3;
	private int[] baseBall;
	private int[] attBaseBall;
	private Random rnd;
	private final int START_NUM;
	private final int END_NUM;
	private int bCnt;
	private int sCnt;
	
	public Baseball() {
		baseBall = new int[MAX];
		attBaseBall = new int[MAX];
		rnd = new Random();
		START_NUM = setStartRange();
		END_NUM = START_NUM*10-1;
		makeRNum(baseBall);
		//printArr();	// 디버깅	
	}

	private int setStartRange()
	{
		int num = 1;
		for(int i=0;i<MAX-1;i++)
			num *= 10;
		return num;
	}
	
	private boolean numRange(int num)
	{
		if(num<START_NUM || num>END_NUM)
		{
			System.out.println("숫자는 " + START_NUM + "이상 " + END_NUM + " 이하의 겹치지 않는 숫자여야 합니다.");
			return false;
		}
		else
			return true;
	}	
	
	private void makeRNum(int[] arrNum)
	{
		while(true)
		{
			int rNum = rnd.nextInt(END_NUM-START_NUM+1)+START_NUM;
			mkArr(arrNum, rNum);
			if(chkNumArr(arrNum))
				break;
		}
	}

	private void mkArr(int[] arrNum, int num)
	{		
		int divisor = 1;
		for(int i=0;i<arrNum.length-1;i++)
			divisor *= 10;
		for(int i=0;i<arrNum.length;i++)
		{
			arrNum[i] = num / divisor;
			num %= divisor;
			divisor /= 10;
		}		
	}
	
	private boolean chkNumArr(int[] arrNum)
	{
		for(int i=0;i<arrNum.length-1;i++)
		{
			for(int j=i+1;j<arrNum.length;j++)
			{
				if(arrNum[i]==arrNum[j])
					return false;
			}
		}
		return true;
	}
	
	private void printArr()
	{
		for(int i=0;i<baseBall.length;i++)
			System.out.print(baseBall[i]);
		System.out.println();
	}	
	public boolean setINum(int num)
	{
		boolean result = true;
		if(numRange(num))
		{
			mkArr(attBaseBall, num);
			result = chkNumArr(attBaseBall);
		}
		else result = false;
		return result;
	}
	
	public void playGame()
	{
		int sCnt = 0;
		int bCnt = 0;
		for(int i=0;i<baseBall.length;i++)
		{
			for(int j=0;j<attBaseBall.length;j++)
			{
				if(baseBall[i] == attBaseBall[j])
				{
					if(i==j) sCnt++;
					else bCnt++;
				}
			}
		}
		this.sCnt = sCnt;
		this.bCnt = bCnt;
	}
	
	public int getSCnt()
	{
		return sCnt;
	}
	
	public void showResult()
	{
		if(sCnt==MAX)
			System.out.println("홈런");
		else if(sCnt==0 && bCnt == 0)
			System.out.println("아웃");
		else
			System.out.println(sCnt + " 스트라이크 " + bCnt + " 볼");		
	}
}
public class BaseballGame {
	
	private Baseball computer;

	public BaseballGame() {
		this.computer = new Baseball();
	}
	
	private boolean attack(int num)
	{
		if(computer.setINum(num))
				return true;
		else
			return false;
	}
	
	public void playBaseballGame(int num)
	{
		if(attack(num))
		{
			computer.playGame();
			computer.showResult();			
		}
		else
			System.out.println("잘못입력하셨습니다.");
	}
	public int getSCnt()
	{
		return computer.getSCnt();
	}
}
import java.util.Scanner;


public class BaseballGameUI {

	public static void main(String[] args) {
		BaseballGame bbGame = new BaseballGame();
		Scanner sc = new Scanner(System.in);
		int iNum = 0;
		while(true)
		{
			System.out.println("자 공격하세요.");
			iNum = sc.nextInt();
			bbGame.playBaseballGame(iNum);
			if(bbGame.getSCnt()==Baseball.MAX)
			{
				System.out.println("게임을 종료합니다.");
				break;
			}
		}
		sc.close();
	}
}

 

Q. 프로그램 사용자로부터 최대 정수 A와 최소 정수 B를 입력 받는다.

   그리고 A와 B사이에 존재하는(A와 B도 포함) 난수 10개를 생성해서 출력하는 프로그램을 작성해보자.

 

A. 강사님의 답

import java.util.Random;
import java.util.Scanner;

public class Q1 {

	public static void main(String[] args) {
		Random rand = new Random();
		Scanner sc = new Scanner(System.in);
		
		int start = 0, end = 0;
		start = sc.nextInt();
		end = sc.nextInt();
		
		for(int i=0;i<10;i++)
			System.out.println(rand.nextInt(end-start+1)+start);
	}
}
728x90