알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

 

문제는 숫자야구 입니다.

1. 컴퓨터값이 0~9까지의 숫자값이 중첩되지 않게 만들어집니다. ( 1,5,6 이런식 1,5,5 X )

2. 사용자가 값을 입력합니다. (1,2,3)

3. 컴퓨터의 값이 1,5,6일 경우 1,2,3을 입력하면 1은 값하고 위치가 똑같기 때문에 1스트라이크가 됩니다.

4. 1,5,6 에서 1,6,5를 입력한 경우 1은 값하고 위치가 똑같고, 6,5는 위치가 다르기 때문에 2스트라이크 1볼이 됩니다.

5. 3스트라이크를 하게 되면 게임이 종료되고 시도 횟수가 나오고 , 게임을 다시 시작할것인지 물어봅니다.

6. 1번을 입력하면 게임을 다시 실행하고 2번을 입력하면 게임은 종료됩니다.


Think🤔

 

코드에 주석으로 설명 덧붙임


Solution✍
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

// 게임 시작
public class start {
    // 싱글톤 , 클래스의 인스턴스간에 공유 오직 한번 할당
    // system.in을 사용해서 한번만 초기화해서 사용하면 자원 낭비 방지
    // 상수값으로 선언하면 프로그램 가독성 향상
    // 테스트에서 예상치 못한 상태 변경을 방지
    private static final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    public static void main(String[] args) {
        System.out.println("게임을 시작합니다.");
        try {
            String retry = "";
            while(true){
                startGame(reader);
                System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.");
                retry = reader.readLine();
                if(retry.equals("1")){
                    System.out.println("게임을 새로 시작합니다.");
                    continue;
                }else if(retry.equals("2")){
                    System.out.println("게임을 종료합니다.");
                    break;
                }else{
                    System.out.println("올바른 값이 입력되지 않았습니다.");
                    continue;
                }
            }

        } catch (IOException e){
            e.printStackTrace();
        } catch (Exception e){
            e.printStackTrace();
        }

    }

    public static void startGame(BufferedReader reader){
        String retry = "";
        try {
            System.out.println("이름을 입력해주십시오.");
            String name = reader.readLine();
            System.out.println("안녕하세요, " + name + "님!");

            // 컴퓨터 수 생성 3자리 1~9까지
            // Math.random() 범위 0.0이상 8.999.. 이하 double값을 얻음 -> int로 형 변환 필요 , +1을 해줌으로써 1~9까지의 정수

            /*
            서로 다른 임의의 수 만족 X

            int ranNum = (int)(Math.random() * 9) + 1;
            int digit = 1; // 자릿수 증가

            for(int i=0; i<3; i++){
                comNum+=ranNum*digit;
                digit*=10;
            }
            */
            List<Integer> digits = new ArrayList<>();
            for (int i = 1; i <= 9; i++) {
                digits.add(i);
            }
            // 숫자 섞기
            Collections.shuffle(digits);
            int comNum = digits.get(0) * 100 + digits.get(1) * 10 + digits.get(2);
            //맞출때까지

            int tryCnt = 0; // 시도 횟수
            int userNum = 0;

            while(true){
                tryCnt++;
                int strike = 0;
                int ball = 0;
                System.out.println("숫자를 입력해주세요 : ");
                userNum = Integer.parseInt(reader.readLine());
                if(userNum > 1000){
                    System.out.println("숫자는 3개만 입력 가능합니다.");
                    continue;
                }

                String comStr = Integer.toString(comNum);
                String userStr = Integer.toString(userNum);
                for(int i=0; i<comStr.length(); i++){
                    for(int j=0; j<userStr.length(); j++){
                        if(comStr.charAt(i) == userStr.charAt(i)){
                            strike++;
                            break;
                        }else if(comStr.charAt(i) == userStr.charAt(j)){
                            ball++;
                            break;
                        }
                    }
                }
                System.out.println(ball + "볼 , " + strike + "스트라이크");

                if(strike == 3){ // 다 맞출 경우 종료
                    System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료");
                    System.out.println("시도 횟수 : " + tryCnt);
                    break;
                }
            }
            //reader.close(); // 자원 누수 발생 방지 close , 입출력스트림은 외부 자원과의 연결을 유지하고 있을 수 있기 떄문

            /*
            * But 여러번 사용해야 하는 경우에는 닫지 않는 것이 좋습니다.
            * 해결책으로는 System.in을 한 번만 사용하여 BufferedReader를 만들고,
            * 이를 계속 재사용하도록 수정하는 것이 좋습니다.
            * System.in에 대한 닫음(close)은 피하는 것이 좋습니다.
            * */
        } catch (IOException e){
            e.printStackTrace();
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}

 


Review🤩

 

입력값에 대해 이해도가 올라갔고, 최적화가 안되어 있어서 다시 풀어야 된다.

싱글톤 패턴으로 구현해야겠다.

 

https://github.com/woowacourse/java-baseball-precourse

 

GitHub - woowacourse/java-baseball-precourse: 숫자 야구게임 미션을 진행하는 저장소

숫자 야구게임 미션을 진행하는 저장소. Contribute to woowacourse/java-baseball-precourse development by creating an account on GitHub.

github.com

포크한 후 내부 함수를 이용해서 다음에 풀어보도록 하겠습니다.


 

+ Recent posts