백준 2503 (숫자 야구)
https://www.acmicpc.net/problem/2503
간단하게 브루트포스로 해결가능한 문제였다.
처음에 문제를 보고 각 스트라이크와 볼에 대해 경우의 수를 빠르게 줄여볼 방법을 생각했지만 string의 길이가 3이고 전체 수가 1000도 안된다는 점을 보고 그냥 브루트포스로 접근했다. (그래도 0ms가 나오더라..)
설명
설명이라고도 하기 쪼끔 민망하지만 설명해보자면 다음과 같다.
인풋이 세자리 string과 스트라이크, 볼로 주어진다.
이때, 주어진 스트링과 123~987(같은 숫자 두번이상 나오면 제외)의 숫자를 모두 체크해 인풋으로 주어진 스트라이크의 수나 볼의 수가 하라도 다르다면 그 숫자는 경우의 수에서 제외한다.
또한 이미 제외된 수는 더이상 볼필요 없으므로 방문체크를 해준다.
모든 인풋을 본 후에 123~987 (같은 숫자 두번이상 나오면 제외)의 숫자중에서 제외되지 않은 수의 개수를 세서 출력한다.
구현
#include <iostream>
using namespace std;
bool fail[1000];
void check(string str, int st, int ba){
int a,b;
for(int i=123;i<988;i++){
if(fail[i]) continue;
a=0,b=0;
string tmp = to_string(i);
for(int k=0;k<3;k++){
for(int s=0;s<3;s++){
if(str[s]==tmp[k]){
if(s==k) a++;
else b++;
}
}
}
if(a!=st || b!=ba) {
fail[i]=true;
}
}
}
int main(void){
ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
for(int i=0;i<1000;i++) fail[i]=false;
int n,a,b;
string tmp;
cin>>n;
for(int i=0;i<n;i++){
cin>>tmp>>a>>b;
check(tmp, a, b);
}
int ans=0;
int num;
for(int i=1;i<10;i++){
for(int j=1;j<10;j++){
if(i==j) continue;
for(int k=1;k<10;k++){
if(k==i || k==j) continue;
num = i*100+j*10+k;
if(!fail[num]) ans++;
}
}
}
cout<<ans;
return 0;
}
'코딩테스트 준비 > PS' 카테고리의 다른 글
C++ 백준 13160 (최대 클리크 구하기) (0) | 2021.11.23 |
---|---|
C++ 백준 16496 (큰 수 만들기) (0) | 2021.11.13 |
C++ 백준 2533 (사회망 서비스 SNS) (0) | 2021.11.10 |
C++ 백준 1202 (보석 도둑) (0) | 2021.11.09 |
C++ 백준 1339 (단어 수학) (0) | 2021.11.08 |