문제

  • 숫자 야구 게임이란 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
[[123, 1, 1], [356, 1, 0], [327, 2, 0], [489, 0, 1]]

return
2

접근

  • strike와 ball을 어떻게 가려낼 것인가?
  • 여러 테스트 케이스들을 모두 만족시키는 것을 어떻게 알아낼 것인가?

내가 생각한 풀이

  • 문제에서 알려준대로 체크하면 된다. 위치가 다른데 숫자가 같으면 볼, 번호와 숫자 모두 같으면 스트라이크!
  • 하나의 숫자를 가지고 주어진 테스트 케이스 모두에 대해 테스트 해보면 된다.

코드

#include <string>
#include <vector>
#include <iostream>
using namespace std;

int solution(vector<vector<int>> baseball) {
    int answer = 0;
    //나올 수 있는 경우는 111~999이다.
    for(int i = 111 ; i<=999 ; i++)
    {
        string temp = to_string(i);
        int temparr[10] = {0, }, flag = 0, count = 0;
        for(int j = 0 ; j<3 ; j++)
        {
            //숫자들을 temparr라는 배열에 기록
            temparr[temp[j] - '0']++;
        }
        for(int j = 0 ;j<10;j++)
        {
            //0은 나올 수 있는 숫자가 아니기 때문에 넘긴다.
            if(temparr[0]>0)
            {
                flag = 1;
                continue;
            }
            //숫자가 중복된 경우 역시 나올 수 없으므로 넘긴다.
            if(temparr[j]>1){
                flag = 1;
                continue;
            }
        }
        if(flag == 0)
        {
            //하나의 숫자를 가지고 테스트 케이스 모두에 대해 테스트
            for(int j = 0 ;j<baseball.size() ; j++)
            {
                string b_temp = to_string(baseball[j][0]);
                int strike = 0, ball = 0;
                for(int k = 0 ; k<3; k++)
                {
                    //ball을 찾는 과정
                    for(int l = 0; l<3; l++)
                    {
                        if(temp[k] == b_temp[l]) ball++;
                    }
                    //strike를 찾는 과정
                    if(temp[k] == b_temp[k]){
                        ball--;
                        strike++;
                    }
                }
                //strike와 ball이 testcase를 만족시키면 count를 하나 올려준다.
                if(strike == baseball[j][1] && ball == baseball[j][2]){
                    count++;
                }
            }
        }
        //count가 testcase의 수와 일치하면 정답을 하나 증가시킨다.
        if(count == baseball.size()) answer++;
    }
    return answer;
}