본문 바로가기

Algorithm/Brute Force

(C++) - 백준(BOJ) 2503번 : 숫자야구

반응형

www.acmicpc.net/problem/2503

 

2503번: 숫자 야구

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

www.acmicpc.net

brute force로 푼 문제였습니다.

 

풀이방법

 1. 111부터 999까지 loop를 돕니다. 같은 숫자인 경우나 0을 포함하는 경우는 건너뜁니다.

 2. 질문에 나온 수로 ball과 strike의 개수를 세줍니다. 한 질문에 대한 ball이나 strike개수가 다르다면 답이 될 수 없으므로 flag를 세워줍니다.

 3. 모든 질문에 대한 ball과 strike개수가 같다면(if(!flag)) 답입니다.

 4. 조건에 만족하는 cnt를 반환한 뒤 출력합니다.

 

Code

#include <bits/stdc++.h>
using namespace std;
int num[1001][3];
int n;

int hasSameNum(string num){
    for(int i = 0; i < num.size(); i++)
        for(int j = i + 1; j < num.size(); j++)
            if(num[i] == num[j]) return 1;
    return 0;
}

int isZero(string num){
    for(int i = 0; i < num.size(); i++)
        if(num[i]=='0') return 1;
    return 0;
}

int getStrike(string num, string answer, int check[]){
    int strike = 0;
    for(int k = 0; k < 3; k++)
        if(num[k] == answer[k]) strike++, check[k] = 1;
    return strike;
}

int getBall(string num, string answer, int check[]){
    int ball = 0;
    for(int k = 0; k < 3; k++)
        for(int t = 0; t < 3; t++)
            if(!check[t] && !check[k] && k!=t && num[k]==answer[t])
                ball++;
    return ball;
}

int candidateNum(){
    int cnt = 0;
    for(int i = 111; i <= 999; i++){
        string answer = to_string(i);
        if(isZero(answer)) continue;
        if(hasSameNum(answer)) continue;
        int flag = 0;
        for(int j = 0; j < n; j++){
            string stringNum = to_string(num[j][0]);
            int check[3] ={0,0,0};
            int strike = getStrike(stringNum,answer,check);
            int ball = getBall(stringNum,answer,check);
            if(strike != num[j][1] || ball != num[j][2]){
                flag = 1;
                break;
            }
        }
        if(!flag) cnt++; 
    }
    return cnt;
}

int main(){
    cin >> n;
    for(int i = 0; i < n; i++) 
        cin >> num[i][0] >> num[i][1] >> num[i][2];
    cout << candidateNum();
}