• toc {:toc}

문제 확인하기

풀이

  1. 숫자 야구의 숫자들은 1) 각 자리 수가 겹치면 안되고 2) 십의 자리, 일의 자리에 0이 들어가면 안 된다.
  2. 모든 조건을 만족해야 가능성이 있는 답에 속할 수 있다.

조건(e.g. 1s 1b)에 맞는지 확인할 때 같은 자리에 같은 숫자가 있으면 스트라이크, 같은 숫자가 있으나 자리가 다르다면 볼로 판별한다.

123 - 1s - 1b 조건을 확인했을 때 325 숫자를 판별한다고 하면 1s 1b로 해당 조건은 통과한다. 하지만 다른 356 조건에서 1s 1b이 되어 제외되기 때문에 전체 조건을 판별하다보면 가능성이 없는 답은 걸러지고 가능성이 있는 답만 나온다.

#include <bits/stdc++.h>
using namespace std;
 
string nums[105];
int strikes[105], balls[105], fail[1005] = {0,};
 
int main(){
    ios::sync_with_stdio(false);
    cin.tie(); cout.tie();
 
    int N, s, b, res = 0;
    char hunds, tens, ones;
    string question;
 
    cin >> N;
 
    for(int i=0; i<N; i++){
        cin >> question >> s >> b;
        nums[i] = question;
        strikes[i] = s;
        balls[i] = b;
    }
 
    for(int i = 123; i <= 987; i++){
        string temp = to_string(i);
        hunds = temp[0];
        tens = temp[1];
        ones = temp[2];
        
        if(hunds == tens || hunds == ones || tens == ones) continue;
        if(tens == '0' || ones == '0') continue;
 
        for(int j = 0; j < N; j++){
            s = 0;
            b = 0;
            question = nums[j];
            for(int k=0; k < 3; k++){
                for(int l = 0; l < 3; l++){
                    if(temp[k] == question[l]){
                        if(k == l) s++;
                        else b++;
                    }
                }
            }
            if(s != strikes[j] || b != balls[j])
                fail[i] = 1;
        }
    }
 
    for(int i = 123; i <= 987; i++){
        string temp = to_string(i);
        hunds = temp[0];
        tens = temp[1];
        ones = temp[2];
        if(hunds == tens || hunds == ones || tens == ones) continue;
        if(tens == '0' || ones == '0') continue;
 
        if (fail[i] == 0) res++;
    }
 
    cout << res << '\n';
 
    return 0;
}