- toc {:toc}
풀이
- 숫자 야구의 숫자들은 1) 각 자리 수가 겹치면 안되고 2) 십의 자리, 일의 자리에 0이 들어가면 안 된다.
- 모든 조건을 만족해야 가능성이 있는 답에 속할 수 있다.
조건(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;
}