백엔드 부트캠프[사전캠프]/문제풀이

[내일배움캠프-사전캠프 문제풀이] JAVA 보너스 문제 "가위바위 보"

sintory-04 2025. 1. 24. 15:28

오늘은 문제가 술술 풀려서 나름 재밌었다.

가위바위보를 만들었던 게 2-3년전 이었던 거 같은데 이렇게 여러 조건, 함수를 주면서 푸니 더 색다른 거 같다.


    보너스 문제: 가위 바위 보

    5번의 가위바위보 게임을 해서 승리한 횟수 상당의 상품을 받아가는 게임을 만들어봐요

    1. 5번의 가위바위보를 진행합니다.

    2.유저는 매 판마다 “가위”, “바위”, “보” 중 하나를 입력합니다.

    - 잘못된 입력을 받았다면 잘못된 입력입니다! 를 출력해주세요.

    3.컴퓨터는 가위 , 바위, 보 중 랜덤하게 하나를 낼 수 있습니다.

    4.매판마다 진행한 가위 바위 보의 승패에 대한 결과를 출력됩니다.

    5.5판을 모두 마치면 승리한 횟수에 걸맞는 경품을 획득할 수 있습니다.


    일단 조건들을 보아하니,

    1. 잘못된 입력을 확인

    2. 랜덤한 가위바위보 출력

    3. 가위바위보 비교

    위의 3가지가 필요하다는 걸 알 수 있다.

    그리하여 3가지 함수틀을 잡고 접근할 것이다.

    1. ArrayList 를 선언

      static ArrayList<String> listRCP = new ArrayList<>() {{
            add("가위");
            add("바위");
            add("보"); }};

    - 자주 쓸 거 같은 배열이니 따로 선언해두었다.

    2. 잘못된 입력 확인하기.

      public boolean checkText(String text, ArrayList<String> listRCP){
        if (listRCP.contains(text.trim())) {
          System.out.println("정상적인 단어를 입력하셨습니다.");
          return true;
        }
        else {
          System.out.println("잘못된 입력입니다!");
          return false;}
      }

    - 혹시, 입력값에 공백이 껴있을 수 있기 때문에 해당 부분을 제거하고 정상입력인지 아닌지 확인하였다.

    - 위에서 이미 가위,바위,보를 선언했기 때문에 arraylist.contains() 함수를 통해 true or false형태로 반환하게끔 코딩했다.

    3. 랜덤한 가위바위보 출력

      // 랜덤한 가위바위보 내는 함수
      public String randomRSP(){
        Random random = new Random();
        return listRCP.get(random.nextInt(listRCP.size()));
      }

    - 컴퓨터가 자동으로 가위, 바위, 보 중 하나를 출력하게끔 함수를 만들었다.

    4. 가위바위보 비교하기

    public int compareText(String user, String auto) {
        // 1 : 유저가 승리, 2 : 유저가 패배, 3. 유저와 무승부
        if (user.equals("가위")) {
          if (auto.equals("가위")) {return 3;}
          else if (auto.equals("바위")) {return 2;}
          else {return 1;}
        }
        else if (user.equals("바위")) {
          if (auto.equals("가위")) {return 1;}
          else if (auto.equals("바위")) {return 3;}
          else {return 2;}
        }
        else { // 보인 경우임.
          if (auto.equals("가위")) { return 2;}
          else if (auto.equals("바위")) {return 1;}
          else {return 3;}
        }
      }

    - 여기서 내가 한 가지 실수 했던 부분이 있는데, Java에서는 equals()로 문자열을 비교한다는 것이다. 가위바위보의 9가지 경우를 잘 설정해두었다.

    - 승리여부를 숫자로 받아 int로 함수를 선언했다.

    5. 메인 함수

    1) 먼저 스캐너를 불러주고, 객체 인스턴스, countWin 변수를 선언해주었다.

        Scanner scanner = new Scanner(System.in);
        Problem04 prob = new Problem04();
        int countWin = 0;

    2) for문 생성

    - while문 할까 했는데. 그냥 for문으로 5회만 돌리기로 했다. 딱히 복잡한 조건이 없어서 for문을 선택했다.

    for (int i=0; i<5; i++){
          System.out.println("*****************");
          System.out.printf("%d 번째 판입니다.",i+1);
          System.out.println("가위 바위 보 중 하나를 입력해주세요.");
          String userText = scanner.nextLine().trim();
          String randomText = prob.randomRSP();

    - 첫부분에서는 간단히 사용자의 입력을 받는 userText와 랜덤한 가위바위보를 만드는 randomText를 선언했다.

    // userText가 먼저 괜찮은지 ?괜찮은 경우에만 비교 시작.
          if (prob.checkText(userText,listRCP)){

    - 이중 if문을 쓸건데, 여기서는 먼저 userText가 제대로 값인지 확인하고. 괜찮을 경우에만 비교함수를 사용할 것이다.

            // 비교하는 함수 가져오기.
            int compareInt = prob.compareText(userText,randomText);
            if (compareInt == 1) {
              System.out.printf("당신의 [ %s ] 그리고 상대는 [ %s ] 으로 ",userText,randomText);
              System.out.println("당신이 승리하셨습니다.");
              countWin ++;
            }
            else if (compareInt == 2){
              System.out.printf("당신의 [ %s ] 그리고 상대는 [ %s ] 으로 ",userText,randomText);
              System.out.println("당신이 패배하셨습니다.");
            }
            else {
              System.out.printf("당신의 [ %s ] 그리고 상대는 [ %s ] 으로 ",userText,randomText);
              System.out.println("서로 비기셨습니다.");
            }
          }
        }
        System.out.println("***********************");
        System.out.println("게임이 종료되었습니다. ");
        System.out.printf("총 이기신 횟수는 %d 입니다. \n", countWin);

    - 그 이후에는 compare함수에 userText와 randomText를 넣어, compareInt(승리,패배,무승부가 담긴 숫자)를 얻어낸다.

    - compareInt를 통해서 승리, 패배, 비김을 if 문을 통해 나누어주고, 승리일 경우에만 countWin을 더해준다.

    3) 마지막으로는 이긴 횟수를 알려주고, 이긴횟수에 따라 상품을 출력해준다.

    System.out.println("***********************");
        System.out.println("게임이 종료되었습니다. ");
        System.out.printf("총 이기신 횟수는 %d 입니다. \n", countWin);
        // 상금 주기
        switch (countWin) {
          case 5:
            System.out.println("상품은 [ 스파르테이트 항공권 ] 입니다.");
            break;
          case 4:
            System.out.println("상품은 [ 호텔 스파르타 숙박권 ] 입니다.");
            break;
          case 3:
            System.out.println("상품은 [ 스파르타 캐니언 항공 투어권 ] 입니다.");
            break;
          case 2:
            System.out.println("상품은 [ 스파르타 랜드 입장권 ] 입니다.");
            break;
          case 1:
            System.out.println("상품은 [ 곰돌이 인형 ] 입니다.");
            break;
          default:
            System.out.println("상품이 꽝입니다. ");
            break;
        }

    5. 전체 코드

    import java.util.*;
    public class Problem04 {
      static ArrayList<String> listRCP = new ArrayList<>() {{
            add("가위");
            add("바위");
            add("보"); }};
    
      // 잘못된 입력 확인하는 함수.
      public boolean checkText(String text, ArrayList<String> listRCP){
        if (listRCP.contains(text.trim())) {
          System.out.println("정상적인 단어를 입력하셨습니다.");
          return true;
        }
        else {
          System.out.println("잘못된 입력입니다!");
          return false;}
      }
    
      // 가위바위보 비교해주는 함수
      public int compareText(String user, String auto) {
        // 1 : 유저가 승리, 2 : 유저가 패배, 3. 유저와 무승부
        if (user.equals("가위")) {
          if (auto.equals("가위")) {return 3;}
          else if (auto.equals("바위")) {return 2;}
          else {return 1;}
        }
        else if (user.equals("바위")) {
          if (auto.equals("가위")) {return 1;}
          else if (auto.equals("바위")) {return 3;}
          else {return 2;}
        }
        else { // 보인 경우임.
          if (auto.equals("가위")) { return 2;}
          else if (auto.equals("바위")) {return 1;}
          else {return 3;}
        }
      }
    
      // 랜덤한 가위바위보 내는 함수
      public String randomRSP(){
        Random random = new Random();
        return listRCP.get(random.nextInt(listRCP.size()));
      }
    
      public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Problem04 prob = new Problem04();
        int countWin = 0;
        for (int i=0; i<5; i++){
          System.out.println("*****************");
          System.out.printf("%d 번째 판입니다.",i+1);
          System.out.println("가위 바위 보 중 하나를 입력해주세요.");
          String userText = scanner.nextLine().trim();
          String randomText = prob.randomRSP();
          // userText가 먼저 괜찮은지 ?괜찮은 경우에만 비교 시작.
          if (prob.checkText(userText,listRCP)){
            // 비교하는 함수 가져오기.
            int compareInt = prob.compareText(userText,randomText);
            if (compareInt == 1) {
              System.out.printf("당신의 [ %s ] 그리고 상대는 [ %s ] 으로 ",userText,randomText);
              System.out.println("당신이 승리하셨습니다.");
              countWin ++;
            }
            else if (compareInt == 2){
              System.out.printf("당신의 [ %s ] 그리고 상대는 [ %s ] 으로 ",userText,randomText);
              System.out.println("당신이 패배하셨습니다.");
            }
            else {
              System.out.printf("당신의 [ %s ] 그리고 상대는 [ %s ] 으로 ",userText,randomText);
              System.out.println("서로 비기셨습니다.");
            }
          }
        }
        System.out.println("***********************");
        System.out.println("게임이 종료되었습니다. ");
        System.out.printf("총 이기신 횟수는 %d회 입니다. \n", countWin);
        // 상금 주기
        switch (countWin) {
          case 5:
            System.out.println("상품은 [ 스파르테이트 항공권 ] 입니다.");
            break;
          case 4:
            System.out.println("상품은 [ 호텔 스파르타 숙박권 ] 입니다.");
            break;
          case 3:
            System.out.println("상품은 [ 스파르타 캐니언 항공 투어권 ] 입니다.");
            break;
          case 2:
            System.out.println("상품은 [ 스파르타 랜드 입장권 ] 입니다.");
            break;
          case 1:
            System.out.println("상품은 [ 곰돌이 인형 ] 입니다.");
            break;
          default:
            System.out.println("상품이 꽝입니다. ");
            break;
        }
      }
    }

    6. 출력문

    *****************
    1 번째 판입니다.가위 바위 보 중 하나를 입력해주세요.
    바위
    정상적인 단어를 입력하셨습니다.
    당신의 [ 바위 ] 그리고 상대는 [ 가위 ] 으로 당신이 승리하셨습니다.
    *****************
    2 번째 판입니다.가위 바위 보 중 하나를 입력해주세요.
    보
    정상적인 단어를 입력하셨습니다.
    당신의 [ 보 ] 그리고 상대는 [ 보 ] 으로 서로 비기셨습니다.
    *****************
    3 번째 판입니다.가위 바위 보 중 하나를 입력해주세요.
    가위
    정상적인 단어를 입력하셨습니다.
    당신의 [ 가위 ] 그리고 상대는 [ 보 ] 으로 당신이 승리하셨습니다.
    *****************
    4 번째 판입니다.가위 바위 보 중 하나를 입력해주세요.
    바위
    정상적인 단어를 입력하셨습니다.
    당신의 [ 바위 ] 그리고 상대는 [ 바위 ] 으로 서로 비기셨습니다.
    *****************
    5 번째 판입니다.가위 바위 보 중 하나를 입력해주세요.
    보
    정상적인 단어를 입력하셨습니다.
    당신의 [ 보 ] 그리고 상대는 [ 바위 ] 으로 당신이 승리하셨습니다.
    ***********************
    게임이 종료되었습니다. 
    총 이기신 횟수는 3회 입니다. 
    상품은 [ 스파르타 캐니언 항공 투어권 ] 입니다.
    
    Process finished with exit code 0