BOJ 2503 : 숫자 야구 - C++

11405 단어 bojboj

숫자야구

  • 정답을 참조한 문제 --> 핵심 로직을 파악하지 못함

코드

#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!
  • 핵심
    : 전체 가능한 경우에서 주어진 입력으로 하나씩 하나씩 제거하는 것이 핵심
    (남는 것 = 받은 모든 입력에도 불구하고 정답 일 가능성이 있는 녀석)

좋은 웹페이지 즐겨찾기