#include <iostream>
using namespace std;
bool arr[1002];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int T,S,B,N,ans=0;
cin >> T;
fill(arr, arr+1002, true);
for(int i=123;i<=999;i++)
{
string tmp = to_string(i);
if(tmp[0]=='0' || tmp[1]=='0' || tmp[2]=='0')
arr[i] = false;
if(tmp[0]==tmp[1] || tmp[0]==tmp[2] || tmp[1]==tmp[2])
arr[i] = false;
}
while(T--)
{
cin >> N >> S >> B;
for(int i=123;i<=999;i++)
{
int s_cnt=0, b_cnt=0;
string fix = to_string(i);
string str = to_string(N);
if(!arr[i]) continue;
for(int a=0;a<3;a++)
{
for(int b=0;b<3;b++)
{
if(fix[a] == str[b] && a == b) s_cnt++;
else if(fix[a] == str[b] && a != b) b_cnt++;
}
}
if(s_cnt != S or b_cnt != B) arr[i] = false;
}
}
for(int i=123;i<=999;i++)
if(arr[i]) ans++;
cout << ans;
return 0;
}
- 로직
1) arr[123] ~ arr[999]
까지 모두 true로 초기화
2) arr[123] ~ arr[999]
중 최초 조건에 맞지 않는 숫자는 false
처리
(조건 : 1. 각 자리 중 하나라도 0인 것
2.각 자리수 중 하나라도 중복이 되는 것)
3) 입력된 숫자,strike,ball
에 대해 123 ~ 999
모두 검사하며 strike 개수와, ball 개수가 일치하지 않으면 false처리
4) arr[]
값이 true
인 것은 가능성 있는 것이니까 count!
- 핵심
: 전체 가능한 경우
에서 주어진 입력
으로 하나씩 하나씩 제거
하는 것이 핵심
(남는 것
= 받은 모든 입력에도 불구하고 정답 일 가능성이 있는 녀석
)