본문 바로가기

코딩테스트 준비/PS

C++ 백준 2503 (숫자 야구)

백준 2503 (숫자 야구)

https://www.acmicpc.net/problem/2503

 

2503번: 숫자 야구

첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트

www.acmicpc.net


간단하게 브루트포스로 해결가능한 문제였다.

 

처음에 문제를 보고 각 스트라이크와 볼에 대해 경우의 수를 빠르게 줄여볼 방법을 생각했지만 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;
}