[백준] 2503번 숫자야구 C++

SmileJun·2025년 8월 7일

알고리즘

목록 보기
24/34

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

C++

#include<iostream>
#include<algorithm>
using namespace std;

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

2
 */

bool check[1000];

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int test, ques, strike, ball,total = 0;
    cin >> test;
    // 1에서 9까지 3자리 수 123 ~ 987 사이의 수이다.
    // 생각하고 있을 가능성 있는 수의 개수

    // 위치와 숫자 모두 같으면 스트라이크, 숫자만 같으면 볼
    // 그럼 123부터 987안에 있는 수 모두 비교해보자.
    // 서로 다른 숫자 세 개로 구성된 세 자리 수

    while(test--) {
        cin >> ques >> strike >> ball;

        int a = ques / 100;
        int b = ques / 10 % 10;
        int c = ques % 100 % 10;

        for(int i = 123; i <= 987; i++) {
            int d = i / 100;
            int e = i / 10 % 10;
            int f = i % 100 % 10;

            if(check[i]) {
                continue;
            }

            if((d == 0 || e == 0 || f == 0) ||(d==e || e==f || d==f)) {
                // 1~9이기 때문에 0나오면 안되고 서로 다른 수니까 이것도 안됨
                check[i] = true;
                continue;
            }

            // ques값과 i값 비교
            int numS = 0, numB = 0;

            if(a==d) {
                numS++;
            }
            if(b==e) {
                numS++;
            }
            if(c==f) {
                numS++;
            }
            if(a==e || a==f) {
                numB++;
            }
            if(b==d || b==f) {
                numB++;
            }
            if(c==d || c==e) {
                numB++;
            }

            if(numS != strike || numB != ball) {
                check[i] = true;
            }
            else {
                check[i] = false;
            }
        }
    }

    for(int i = 123; i <= 987; i++) {
        if(!check[i]) {
            total++;
        }
    }
    cout << total << "\n";
}

문제풀이

  • 생각하는 숫자의 범위가 123 ~ 987로 작아서 그냥 모든 경우를 다 비교해봤다. 생각하는 숫자 i범위와ques의 100의 자리수, 10의 자리수, 1의 자리수를 각각 변수로 구했다. 그리고 각 자릿 수를 비교하면서 스트라이크, 볼의 개수를 파악했다. 그리고 최종적으로 입력받은 스트리이크 볼의 개수와 같으면 그 i를 bool타입 false로 지정했다. 마지막에 false의 개수를 파악해서 출력했다.

Comment

  • 말하는 숫자가 네자리 수였다면 시간복잡도가 커질 수 있겠지만, 세 자리수라서 그냥 모든 경우의 수를 구했다.
profile
하루하루는 성실하게, 인생 전체는 되는대로

0개의 댓글