본문으로 바로가기

[프로그래머스] 숫자야구 문제

category 알고리즘/문제풀이 2020. 1. 20. 21:51

<문제 설명>

숫자 야구 게임이란 2명이 서로가 생각한 숫자를 맞추는 게임입니다. 게임해보기

각자 서로 다른 1~9까지 3자리 임의의 숫자를 정한 뒤 서로에게 3자리의 숫자를 불러서 결과를 확인합니다. 그리고 그 결과를 토대로 상대가 정한 숫자를 예상한 뒤 맞힙니다.

* 숫자는 맞지만, 위치가 틀렸을 때는 볼 * 숫자와 위치가 모두 맞을 때는 스트라이크 * 숫자와 위치가 모두 틀렸을 때는 아웃

예를 들어, 아래의 경우가 있으면

A : 123 B : 1스트라이크 1볼. A : 356 B : 1스트라이크 0볼. A : 327 B : 2스트라이크 0볼. A : 489 B : 0스트라이크 1볼.

이때 가능한 답은 324와 328 두 가지입니다.

질문한 세 자리의 수, 스트라이크의 수, 볼의 수를 담은 2차원 배열 baseball이 매개변수로 주어질 때, 가능한 답의 개수를 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 질문의 수는 1 이상 100 이하의 자연수입니다.
  • baseball의 각 행은 [세 자리의 수, 스트라이크의 수, 볼의 수] 를 담고 있습니다.

<입출력 예>

baseball return
[[123, 1, 1], [356, 1, 0], [327, 2, 0], [489, 0, 1]] 2

<내 문제 풀이>

처음 문제를 접했을 때, 막막하게 받아들였지만

완전탐색 카테고리에 속해있는 문제여서 무식하게 푸는게 답인가 싶어 그렇게 해결했다.

123부터 모든 숫자를 하나씩 입력 케이스와 비교해서 모든 케이스에 대해 통과하는 수만 count하는 방식을 선택했다.

 

123부터 987까지의 숫자를 방문할때 각 자리수 숫자들 사이에 중복이 있거나, 0이 있을 시는 넘어갔다.

class Solution {
    public int solution(int[][] baseball) {
        int answer = 0;
        int strike = 0;
        int ball = 0;
        boolean flag = true;
        String num1 = "";
        String num2 = "";

        for (int i = 123; i <= 987; i++) {
            num1 = Integer.toString(i);
            if (num1.charAt(0) == num1.charAt(1) || num1.charAt(0) == num1.charAt(2) || num1.charAt(1) == num1.charAt(2))
                continue;
            else if (num1.charAt(0) == '0' || num1.charAt(1) == '0' || num1.charAt(2) == '0')
                continue;
            flag = true;
            for (int j = 0; j < baseball.length; j++) {     
                strike = 0;
                ball = 0;
                for (int a = 0; a < 3; a++) {
                    for (int b = 0; b < 3; b++) {
                        num2 =Integer.toString(baseball[j][0]);
                        if (a == b&&num1.charAt(a) == num2.charAt(b))
                        {
                            strike++;
                            continue;
                        }
                        if (a != b&&num1.charAt(a) == num2.charAt(b)) {
                            ball++;
                            continue;
                        }
                    }
                }

                if (strike != baseball[j][1] || ball != baseball[j][2]) {
                    flag = false;
                    break;
                }
            }
            if (flag == true) {
                answer++;
            }
        }
        return answer;
    }
}