ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [알고리즘 문제] 숫자야구 구현
    IT/알고리즘 2019. 4. 18. 10:19

     예전에 숫자야구를 만드는 문제를 풀었던 적이 있다. 


     숫자야구는 한플레이어(컴퓨터)가 중복이 없는 1부터 9까지의 임의의 숫자 3개를 정하면 다른 플레이어가 그 3개의 숫자를 맞추는 게임이다. 숫자와 그 숫자의 자리까지 다 맞춰야하는데 숫자와 자리가 둘다 맞으면 스트라이크, 숫자만 맞고 자리가 틀리면 볼, 숫자와 자리가 맞는게 하나도 없다면 아웃이다. 10번의 시도안에 숫자와 자리 전부 맞추면 이기는게임이다! (어렸을때 수업시간에 많이했던 게임 ㅎ)


    그때는 문제를 푸는데 되게 오래걸렸는데 풀면서 되게 재밌었던 것으로 기억한다.

    지금 꽤 시간이 지났는데 과연 풀 수 있을까?!해서 다시 한번 풀어봤는데 생각보다 너무 쉬워서 놀랬다..예전에 그렇게 고생했는데 ㅠㅠㅠ 나도 성장을 한걸까..!(울컥)


    그때는 어떻게 구현했는지는 기억이 잘 안나지만 아마 지금 코드와 비슷했던것 같다.


    숫자야구 코드↓↓↓


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    public class baseballGame {
     
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Scanner scan = new Scanner(System.in);
            
            int[] number = new int[3];    //랜덤 숫자가 들어갈 배열
            int[] answer = new int[3];    //도전해볼 숫자가 들어갈 배열
            int ball = 0//볼의 개수
            int strike = 0;    //스트라이크 개수
            
            //랜덤함수 만드는 반복문
            for(int i=0; i<3; i++){
                number[i] = (int)(Math.random()*9)+1;
                for(int j=0; j<i; j++){    //중복숫자가 나오지 않게 하기위함
                    if(number[i] == number[j]){
                        i--;
                        break;
                    }
                }
            }
            
    //        for(int i=0; i<3; i++){
    //            System.out.print(number[i]);
    //        }
            
            
            for(int x=0; x<10; x++){
                //도전할 숫자 입력
                for(int i=0; i<3; i++){
                    answer[i] = scan.nextInt();
                }
                
                //숫자와 자리가 맞다면 스트라이크+1, 숫자는 맞고 자리가 틀리면 볼+1
                for(int i=0; i<3; i++){
                    for(int j=0; j<3; j++){
                        if(number[i] == answer[j]){
                            if(i == j){
                                strike++;
                            }else{
                                ball++;
                            }
                        }
                    }
                }
                            
                if(ball == 0 && strike == 0){ //모든 숫자가 틀렸을 경우
                    System.out.println("OUT!");
                }else if(ball == 0 && strike != 0){    
                    if(strike==3){    //정답을 맞춘 경우
                        System.out.println("맞췄습니다. 승리했습니다!");
                        break;
                    }else{
                        System.out.println(strike + "Strike");
                    }
                }else if(ball != 0 && strike == 0){
                    System.out.println(ball + "Ball");
                }else{
                    System.out.println(strike + "Strike  " + ball + "Ball");
                }
                
                //한판이 끝나고 볼과 스트라이크 초기화 후 다시도전
                ball = 0;
                strike = 0;
                
                //10번안에 답을 못맞췄을 경우
                if(x==9){
                    System.out.print("패배했습니다. 답은 ");
                    for(int y=0; y<3; y++){
                        System.out.print(number[y]);
                    }
                    System.out.println("입니다.");
                }
            }
        
        }
     
    }
    cs


     나는 이렇게 구현했다. 솔직히 내 코드가 지저분하고 효율적이지 못하다는 것을 .............알고있다 ㅠㅠ 생각이 둔해서 경우의수가 있으면 죄다 조건걸어주는 걸 좋아해서 ㅎ..... 풀면서도 이것보다 더 나은 코드가 존재할거란 생각이 들었다..! 다른 블로그도 찾아바야짛


    심심할때 컴퓨터랑 놀기로하자..

     자료구조에 대해 좀 더 공부를 해보아야겠다.

    댓글

Designed by Tistory.