본문 바로가기
Programming/BOJ

[C/C++] 백준 #2503 숫자야구(브루트포스)

by 작은별하나 2023. 5. 29.
반응형

숫자야구는 게임기가 없던 시절에 자주 했던 게임이죠.  숫자위치에 따라서 스트라이크와 볼을 불러주면, 그 결과에 따라서 상대방의 숫자를 맞추는 게임입니다.

 

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

 

2503번: 숫자 야구

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

www.acmicpc.net

이번 문제는 기존에 나온 결과를 가지고 가능성이 있는 숫자들의 개수를 알아내는 문제입니다.  이것을 이용하면 사람과 컴퓨터간에 숫자야구 게임을 만들 수도 있습니다.

 

baseball

 

알고리즘은 상당히 간단합니다.  모든 숫자리스트에 대해서 스트라이크와 볼을 기존 히스토리에 대해서 하면서 같은 결과가 나오면 가능성 있는 숫자가 됩니다.  이것을 카운팅하면 됩니다.

 

제가 작성한 소스입니다.

//------------------------------------------------
//    baekjoon #2503
//        - by Aubrey Choi
//        - created at 2019-07-06
//------------------------------------------------
#include <stdio.h>

int main()
{
    int n, h[100][5], st, ba, ans = 0;
    scanf("%d", &n);
    for(int i = 0; i < n; i++)
        scanf("%d%d%d", &h[i][0], &h[i][1], &h[i][2]);
    for(int a = 1; a <= 9; a++)
    {
        for(int b = 1; b <= 9; b++)
        {
            if(a == b) continue;
            for(int c = 1; c <= 9; c++)
            {
                if(a == c || b == c) continue;
                bool found = true;
                for(int i = 0; i < n; i++)
                {
                    int ca = h[i][0]/100, cb = (h[i][0]/10)%10, cc = h[i][0]%10;
                    st = ba = 0;
                    if(a == ca) st++;
                    if(b == cb) st++;
                    if(c == cc) st++;
                    if(a == cb || a == cc) ba++;
                    if(b == ca || b == cc) ba++;
                    if(c == ca || c == cb) ba++;
                    if(st != h[i][1] || ba != h[i][2])
                    {
                        found = false;
                        break;
                    }
                }
                if(found) ans++;
            }
        }
    }
    printf("%d\n", ans);
    return 0;
}
728x90

댓글