혜랑's STORY

[BOJ_C++] 2503번 : 숫자 야구 본문

무지성 공부방/알고리즘 해결

[BOJ_C++] 2503번 : 숫자 야구

hyerang0125 2021. 8. 17. 23:19

code

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <cstring>

using namespace std;

bool visited[1001];

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int n, num, strike, ball, cnt = 0, s_cnt, b_cnt;
    string temp, num_str;
    memset(visited, true, sizeof(visited));
    for (int i = 123; i < 1000; i++) {
        temp = to_string(i);
        if (temp[0] == temp[1] || temp[1] == temp[2] || temp[0] == temp[2])
            visited[i] = false;
        if (temp[0] == '0' || temp[1] == '0' || temp[2] == '0')
            visited[i] = false;
    }

    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> num >> strike >> ball;
        num_str = to_string(num);
        for (int j = 123; j < 1000; j++) {
            s_cnt = b_cnt = 0;
            if (visited[j]) {
                temp = to_string(j);

                for (int x = 0; x < 3; x++) {
                    for (int y = 0; y < 3; y++) {
                        if (x == y && num_str[x] == temp[y]) {
                            s_cnt++; continue;
                        }
                        if (x != y && num_str[x] == temp[y]) {
                            b_cnt++; continue;
                        }
                    }
                }

                if (strike != s_cnt || ball != b_cnt)
                    visited[j] = false;
            }
        }
    }

    for (int i = 123; i < 1000; i++)
        if (visited[i]) cnt++;

    cout << cnt;

	return 0;
}
  • 먼저 123부터 999까지 같은 숫자가 여러 자리수에 존재하거나 0이 존재한다면 visited[i]에 답이 될 수 없음을 체크한다.
  • 이후 n개의 질문만큼 for문을 수행하며 정답이 될 수 있는 가능성이 있는 수(visited[i] == true)라면 스트라이크와 볼을 검사하여 정답이 될 수 있나 확인한다.
  • 정답이 되려면 입력받은 숫자와 i를 검사했을 때 스트라이크와 볼의 수가 같아야 한다. (x와 y는 입력받은 수(num)과 i의 자리 수이다.)
  • 스트라이크 검사법 : 각 자리수가 같으면서 그 자리에 있는 값이 동일하다면 strike count를 증가시킨다.
  • 볼 검사법 : 자리수는 다르지만 값은 동일하다면 ball count를 증가시킨다.
  • 이후 영수가 대답한 스트라이크와 볼 수와 다르다면 정답이 될 가능성이 없는 수이므로 false를 넣어준다.
  • 질문이 끝나면 정답 가능성이 있는 수를 모두 세어 출력한다.

결과