프로그래밍 언어/javastudy

명품 Java Essential 6단원 실습문제 1~6

fladi 2021. 7. 15. 07:56
728x90

<1. MyPoint클래스>

class MyPoint {
	public MyPoint(int x, int y) {
		this.x = x;
		this.y = y;
	}
	@Override
	public String toString() {
		return "MyPoint (" + x +", " + y +")";
	}

	private int x, y;
}

public class app {
	public static void main(String[] args) {
		MyPoint a = new MyPoint(3, 20);
		System.out.println(a);
	}
}

toString만 오버라이딩 해주면 됩니다~~

함수 매개변수랑 반환값은 java se 15 oracle에 Object클래스의 메소드를 검색해서 복붙해줬습니다!

똑같아야 오버로딩이 아니라 오버라이딩이 될테니까요.

 

 

<2. 공백으로 분리된 어절이 몇 개인지 출력>

import java.util.Scanner;
import java.util.StringTokenizer;

public class App {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);

		while (true) {
			String input = scanner.nextLine();
			
			if (input.equals("exit"))
				break;

			StringTokenizer st = new StringTokenizer(input, " ");
			int n = st.countTokens();
			System.out.println("어절 개수는 " + n);
		}
		
		System.out.println("종료합니다...");
		
		scanner.close();
	}
}

StringTokenizer를 사용하면 어렵지 않게 풀 수 있습니다.

 

 

 

<3. 모두 같은 수가 나오면 프로그램 종료>

public class app {
	public static void main(String[] args) {
		int[] randarr = new int[3];
		
		while (true) {
			for (int i =0; i<3; i++) {
				randarr[i] = (int)(Math.random()*3+1);
				System.out.print(randarr[i] + "\t");
			}
			System.out.println();
			
			if (randarr[0] == randarr[1] && randarr[1] == randarr[2])
				break;
		}
		System.out.println("성공");
	}
}

저는 Random객체를 만들지 않고 Math의 static메소드 random()을 이용했습니다.

 

 

 

<4. 덧셈 결과 출력 프로그램>

import java.util.Scanner;
import java.util.StringTokenizer;

public class plus {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String str = scanner.nextLine();
   		int sum = 0;
		
		StringTokenizer st = new StringTokenizer(str, "+");
		
		while (st.hasMoreTokens()) {
			String temp = st.nextToken().trim();
			sum += Integer.parseInt(temp);
		}
		
		System.out.println("합은 " + sum);
		
		scanner.close();
	}
}

이렇게 응용할 수 있군요! 

 

 

 

<5. Adder>

package util;

public class Adder {
	private int x, y;
	public Adder(int x, int y) {
		this.x = x;
		this.y = y;
	}
	public int add() {
		return x + y;
	}
}
package app;

import util.Adder;

public class Main {
	public static void main(String[] args) {
		Adder adder = new Adder(2,5);
		System.out.println(adder.add());
	}
}

import해줘야 Adder이름만 써서 클래스를 만들 수 있죠!

 

 

 

<6. 가위바위보게임>

 

 

진짜 질릴정도로 많이 만드는 가위바위보 게임이네요.

저는 가위바위보 게임 클래스를 하나 새로 만들어줬습니다.

 

 

main먼저 보면

	public static void main(String[] args) {
		RockScissorGame game = new RockScissorGame();
		boolean go = true;

		while (go) {
			go = game.run();
		}

		System.out.println("게임을 종료합니다.");
	}

아주 간결하게 만들었습니다.

RockScissorGame이라는 클래스 객체를 만들어서 run메소드만 반복호출 해주면 됩니다.

run메소드는 true/false값을 호출하는데, 게임을 끝내라는 입력을 받으면 false를 반환하고 게임이 종료됩니다.

 

RockScissorGame클래스는 멤버변수 2개, 메소드 5개로 구성되어 있습니다.

메소드 중에서 외부에서 사용하는 건 run뿐이라 나머지 4개는 private에 넣어줬습니다.

 

private int com; 컴퓨터의 입력. 1(가위), 2(바위), 3(보) 중 랜덤한 값이 할당된다.
private int user; 사용자의 입력. 1(가위), 2(바위), 3(보), 4(끝내기) 중 하나이며, 4가 대입되면 프로그램이 종료됨.
private void inputUser() 1(가위), 2(바위), 3(보), 4(끝내기) 중 하나를 사용자에게 입력받아 user필드에 넣음.
private void setCom() com변수에 1~3중 랜덤한 값이 들어간다.
private String get(int key) 1~3의 키값을 입력받아 키값에 해당하는 문자열을 반환함.
ex) 1을 입력받으면 "가위"를 반환.
private void whoIsWin() com변수와 user변수를 비교하여 누가 이겼는지 화면에 출력해주는 함수.
public boolean run() inputUser메소드를 수행한 후 user가 4이면 프로그램을 종료하도록 false값을 리턴한다. 4가 아니라면 사용자와 컴퓨터의 패를 출력하고 whoIsWin() 메소드를 호출한 후 true를 리턴한다.

 

 

코드입니다.

class RockScissorGame {
	private int com;
	private int user;

	private void inputUser() {
		Scanner scanner = new Scanner(System.in);

		while (true) {
			try {
				System.out.println("==================================");
				System.out.print("가위(1), 바위(2), 보(3), 끝내기(4)>>");
				user = scanner.nextInt();
				if (1 <= user && user <= 4)
					break;
				else {
					System.out.println("잘못된 입력입니다. 다시 입력하세요!");
					continue;
				}
			} catch (InputMismatchException e) {
				System.out.println("잘못된 입력입니다. 다시 입력하세요!");
				scanner.next();
			}
		}
	}

	private void setCom() {
		com = (int) (Math.random() * 3 + 1);
	}

	private String get(int key) {
		String temp = "";

		switch (key) {
		case 1:
			temp = "가위";
			break;
		case 2:
			temp = "바위";
			break;
		case 3:
			temp = "보";
			break;
		}

		return temp;
	}


	private void whoIsWin() {
		int m;
		
		if (com == user)
			m = 0;
		else if (com - user == -1 || com - user == 2)
			m = 1;	//사용자 이김
		else
			m = 2;
		
		switch (m) {
		case 0:
			System.out.println("비겼습니다.");
			break;
		case 1:
			System.out.println("사용자가 이겼습니다.");
			break;
		case 2:
			System.out.println("사용자가 졌습니다.");
			break;
		}
	}

	public boolean run() {
		inputUser();
		if (user == 4)
			return false;

		setCom();
		
		String user_s = get(user);
		String com_s = get(com);
		System.out.println("사용자 " + user_s + " : 컴퓨터 " + com_s);

		whoIsWin();

		return true;
	}
}

이번에는 승리 알고리즘을 다르게 짜봤습니다.

종이에 경우의 수를 써봤는데

 

com user(win) com-user
1 2 -1
2 3 -1
3 1 2
com(win) user com-user
2 1 1
3 2 1
1 3 -2

이렇게 빼기를 이용하니 사용자가 이기는 경우가 컴퓨터와 이기는 경우와 겹치지 않고,

(com - user == -1 || com - user == 2) 와 같이 깔끔하게 나오더라고요.

 

예전 알고리즘은 (com == 1 && user ==2)||(com == 2 && user ==3)||(com == 3 && user ==1)

이런식이었는데, 이거보다 훨씬 간결해보이는 것 같습니다. 

물론 코드 보는 사람은 바로 이해 못할 수도 있지만요... 뭐가 좋다고는 딱 못 말하겠습니다.

 

728x90