본문 바로가기

JAVA

[내일 배움 캠프, JAVA 달리기 반] 보너스 문제 : 가위 바위 보

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 메서드를 만들어, 무승부가 될 조건, 논리연산자를 활용한 이길 조건, 그외 나머지는 다 패배로 하였다.