1. 문제
2. 풀이
import java.util.Map;
import java.util.Random;
import java.util.Scanner;
public class Main {
static public Map<Integer, String> gifts = Map.of(
0, "❌ 꽝",
1, "🧸 곰돌이 인형",
2, "🎟️ 스파르타 랜드 입장권",
3, "🚁 스파르타 캐니언 항공 투어권",
4, "🏨 호텔 스파르타 숙박권",
5, "✈️ 스파르테이트 항공권"
);
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Random random = new Random();
int time = 5;
int winTime = 0;
String[] rpc = {"가위","바위","보"};
while (time > 0) {
System.out.print("가위 바위 보 중 하나를 입력해주세요 : ");
String userInput = scanner.nextLine();
String computer = rpc[random.nextInt(rpc.length)];
switch(userInput) {
time--;
case "가위": {
switch(computer) {
case "가위": {
System.out.println("비겼습니다.");
break;
}
case "바위": {
System.out.println("졌습니다.");
break;
}
case "보": {
System.out.println("이겼습니다.");
winTime ++;
break;
}
}
break;
}
case "보": {
switch(computer) {
case "가위": {
System.out.println("졌습니다.");
break;
}
case "바위": {
System.out.println("이겼습니다.");
winTime ++;
break;
}
case "보": {
System.out.println("비겼습니다.");
break;
}
}
break;
}
case "바위": {
switch(computer) {
case "가위": {
System.out.println("이겼습니다.");
winTime ++;
break;
}
case "바위": {
System.out.println("비겼습니다.");
break;
}
case "보": {
System.out.println("졌습니다.");
break;
}
}
break;
}
default: {
System.out.println("잘못된 입력입니다!");
}
}
}
System.out.println("총 " + winTime + "번 이겼습니다.");
System.out.println("경품은 " + gifts.get(winTime) + "입니다.~~");
}
}
- 지금까지 배웠던 Map, Random, Scanner에 Switch 문을 활용하여 문제를 풀었다.
- 각 가위, 바위, 보에 대한 결과를 이중 switch 문으로 대처하여 상당히 중첩되는 부분이 많다고 느꼈지만, 리팩토링의 한계를 느껴 챗지피티의 도움을 얻었다.
# GPT 리팩토링
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;
public class Main {
static final Map<Integer, String> gifts = new HashMap<>() {{
put(0, "❌ 꽝");
put(1, "🧸 곰돌이 인형");
put(2, "🎟️ 스파르타 랜드 입장권");
put(3, "🚁 스파르타 캐니언 항공 투어권");
put(4, "🏨 호텔 스파르타 숙박권");
put(5, "✈️ 스파르테이트 항공권");
}};
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Random random = new Random();
int attempts = 5;
int winCount = 0;
String[] rpc = {"가위", "바위", "보"};
while (attempts > 0) {
System.out.print("가위 바위 보 중 하나를 입력해주세요: ");
String userInput = scanner.nextLine();
if (!isValidChoice(userInput)) {
System.out.println("잘못된 입력입니다! 다시 입력해주세요.");
continue;
}
String computerChoice = rpc[random.nextInt(rpc.length)];
System.out.println("컴퓨터: " + computerChoice);
int result = getGameResult(userInput, computerChoice);
if (result == 1) {
System.out.println("이겼습니다!");
winCount++;
} else if (result == -1) {
System.out.println("졌습니다.");
} else {
System.out.println("비겼습니다.");
}
attempts--;
}
System.out.println("총 " + winCount + "번 이겼습니다.");
System.out.println("경품은 " + gifts.getOrDefault(winCount, "🎉 더 많은 승리를 축하합니다!") + " 입니다.");
}
private static boolean isValidChoice(String choice) {
return choice.equals("가위") || choice.equals("바위") || choice.equals("보");
}
private static int getGameResult(String user, String computer) {
if (user.equals(computer)) return 0; // 무승부
if ((user.equals("가위") && computer.equals("보")) ||
(user.equals("바위") && computer.equals("가위")) ||
(user.equals("보") && computer.equals("바위"))) {
return 1; // 사용자 승리
}
return -1; // 사용자 패배
}
}
- 도중에 Map 값의 변경이 일어나지 않지만, 지피티는 HashMap Class를 사용하여 Map 값의 변경에 대비하였다.
- isValidChoice 메서드를 만들어 입력값이 "가위", "바위", "보" 중에 하나라도 같으면 true를 반환한다.
(※ String은 객체이다. 이때, equals 메서드는 String 객체끼리의 내용 그 자체를 비교한다. 이 부분은 나중에 더 공부하여 정리할 것이다.)
- getGameResult 메서드를 만들어, 무승부가 될 조건, 논리연산자를 활용한 이길 조건, 그외 나머지는 다 패배로 하였다.
'JAVA' 카테고리의 다른 글
[JAVA] JAVA란? (0) | 2025.04.11 |
---|---|
[내일 배움 캠프, JAVA 달리기 반] Lv.3 단어 맞추기 게임 (0) | 2025.04.04 |
[내일 배움 캠프, JAVA 달리기 반] (0) | 2025.04.02 |
[Java] Map 자료구조와 Map 인터페이스란? (0) | 2025.04.02 |
[내일 배움 캠프, JAVA 달리기 반] Lv1. 랜덤 닉네임 생성기 (0) | 2025.04.01 |