PS/브루트포스 알고리즘[Bruteforce]

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

SeungbeomKim 2022. 10. 19. 16:26
반응형

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

 

2503번: 숫자 야구

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

www.acmicpc.net

<코드>

#include <iostream>
#include <algorithm>
#include <vector>
#include <tuple>
#include <cstring>
#include <string.h>


using namespace std;
int result = 0;
bool num[1000];
bool sameandzerocheck(string s)
{
    if(s[0]==s[1] || (s[0]==s[2]) || (s[1]==s[2])) 
    {
        return false;
    }
    else if( s[0] =='0' || s[1] =='0' || s[2] == '0')
    {
        return false;
    }
    else return true;
}

int main()
{
    int n;
    cin>>n;
    vector<tuple<string,int,int>>v;
    memset(num,true,sizeof(num));
    string number; 
    int strike, ball;
    for(int i=0;i<n;i++)
    {
        cin>>number>>strike>>ball;
        if(sameandzerocheck(number))
        {
            v.push_back(make_tuple(number, strike, ball));
        }

    }
    for(int i=0;i<v.size();i++)
    {
        string cmp = get<0>(v[i]);
        int cmpstrike = get<1>(v[i]);
        int cmpball = get<2>(v[i]);
        
        for(int j=123;j<=999;j++)
        {
            int strikecnt = 0;
            int ballcnt = 0;
            string st = to_string(j);
            if(sameandzerocheck(st))
            {
                for(int a=0;a<3;a++)
                {
                    for(int b=0;b<3;b++)
                    {
                        if(a==b && st[a] == cmp[b])
                        {
                            strikecnt++;
                        } 
                        if(a!=b && st[a] == cmp[b])
                        {
                            ballcnt++;
                        }
                    }
                }
                if((cmpstrike != strikecnt) || (cmpball != ballcnt))
                {
                    num[j] = false;
                }
            }
        }
    }
    for(int i=123;i<=999;i++)
    {
        
        if(sameandzerocheck(to_string(i)) && num[i]==true) result++;
    }
    
    cout<<result<<'\n';

}

<풀이 과정>

첫 번째 bool samezerocheck 함수는 숫자에 0과 같은 수가 존재하는지 검사하는 과정이다.

 

예시를 보면

4
123 1 1
356 1 0
327 2 0
489 0 1

123은 예측 넘버이고, 그 뒤에 따르는 두 개의 1은 strike, ball의 개수이다.

다음 케이스에서 다음 4 조건에 해당하는 값은 324, 328이다.

324,328에서 123을 바라봤을때 해당하는 값은

1스트라이크(2가 같은 위치) 1볼(3은 다른 위치에 있지만 해당하는 값)이다

 

356도 마찬가지로 1스트라이크(3이 같은 위치)이다.

 

이들을 하나씩 검사하기 위해서는 문자열로 입력받아 index에 해당하는 값이 같은지 비교해줘야 한다.

 

strike는 비교하는 수와의 인덱스(같은 위치)와 값이 모두 같으면 되고,

ball은 비교하는 수와 인덱스 값은 달라야 하고(다른 위치), 값은 같아야 한다. 

반응형