백준 - 2503번 숫자 야구

weenybeenymini·2021년 1월 19일
0

문제

3자리 수로 친구랑 숫자 야구를 한당
물어보는 숫자와 몇 스트라이크, 몇 볼 인지 정보들이 주어질 때
가능한 답의 총 개수는?

생각

다른 사람들은 123~987 까지의 수들 중 말이 되는 수를 찾거나
말이 안 되는 수를 지우는 방법으로 많이들 풀던데

나는 가능한 상태를 저장하면서 탐색하는 BFS/DFS를 최근에 너무 많이 풀었더니ㅋㅋㅋ

가능한 숫자 상태들을 일일이 만들면서 check배열에 표시해줬다

(뭔가 스트라이크랑 볼 정보가 있으면
생각보다는 가능한 숫자 상태들이 별로 없을 것 같아서 이렇게 구현해 봤는데

내가 노가다를 해서 조금 만들든, 그냥 숫자들 돌아가면서 되는지 안 되는지 보든,
for문 3번 도는건 똑같아서 그런지 시간은 비슷한 것 같다 그냥 노다가였던걸로ㅋㅋ

코드는 아까워서 올려야징)

코드

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>

using namespace std;

int testcasenum;
vector<pair<int, pair<int, int>>> testcase;

int check[1000];

void solve(int index) {
	int n3 = testcase[index].first % 10;
	int n2 = (testcase[index].first % 100) / 10;
	int n1 = testcase[index].first / 100;

	int ns = testcase[index].second.first;
	int nb = testcase[index].second.second;

	if (ns > 0) {
		if (ns == 3) {
			return;
		}
		else if (ns == 2) {
			for (int i = 1; i < 10; i++) {
				if (i != n1 && i != n2 && i != n3) {
					check[n1 * 100 + n2 * 10 + i]++;
					check[n1 * 100 + i * 10 + n3]++;
					check[i * 100 + n2 * 10 + n3]++;
				}
			}
		}
		else {
			if (nb > 0) {
				if (nb == 2) {
					check[n1 * 100 + n3 * 10 + n2]++;
					check[n2 * 100 + n1 * 10 + n3]++;
					check[n3 * 100 + n2 * 10 + n1]++;
				}
				else {
					for (int i = 1; i < 10; i++) {
						if (i != n1 && i != n2 && i != n3) {
							check[n1 * 100 + n3 * 10 + i]++;
							check[n1 * 100 + i * 10 + n2]++;

							check[i * 100 + n2 * 10 + n1]++;
							check[n3 * 100 + n2 * 10 + i]++;

							check[n2 * 100 + i * 10 + n3]++;
							check[i * 100 + n1 * 10 + n3]++;
						}
					}
				}
			}
			else {
				for (int i = 1; i < 10; i++) {
					for (int j = 1; j < 10; j++) {
						if (i != j) {
							if (i != n1 && i != n2 && i != n3) {
								if (j != n1 && j != n2 && j != n3) {
									check[n1 * 100 + i * 10 + j]++;
									check[i * 100 + n2 * 10 + j]++;
									check[i * 100 + j * 10 + n3]++;
								}
							}
						}
					}
				}
			}
		}
	}
	else {
		if (nb > 0) {
			if (nb == 3) {
				check[n2 * 100 + n3 * 10 + n1]++;
				check[n3 * 100 + n1 * 10 + n2]++;
			}
			else if (nb == 2) {
				for (int i = 1; i < 10; i++) {
					if (i != n1 && i != n2 && i != n3) {
						check[i * 100 + n3 * 10 + n2]++;
						check[n3 * 100 + i * 10 + n2]++;
						check[n2 * 100 + n3 * 10 + i]++;

						check[i * 100 + n3 * 10 + n1]++;
						check[n3 * 100 + i * 10 + n1]++;
						check[n3 * 100 + n1 * 10 + i]++;

						check[i * 100 + n1 * 10 + n2]++;
						check[n2 * 100 + i * 10 + n1]++;
						check[n2 * 100 + n1 * 10 + i]++;
					}
				}
			}
			else {
				for (int i = 1; i < 10; i++) {
					for (int j = 1; j < 10; j++) {
						if (i != j) {
							if (i != n1 && i != n2 && i != n3) {
								if (j != n1 && j != n2 && j != n3) {
									check[i * 100 + n1 * 10 + j]++;
									check[i * 100 + j * 10 + n1]++;

									check[i * 100 + n3 * 10 + j]++;
									check[n3 * 100 + i * 10 + j]++;

									check[i * 100 + j * 10 + n2]++;
									check[n2 * 100 + i * 10 + j]++;
								}
							}
						}
					}
				}
			}
		}
		else {
			for (int i = 1; i < 10; i++) {
				for (int j = 1; j < 10; j++) {
					for (int k = 1; k < 10; k++) {
						if (i != j && j != k && k != i) {
							if (i != n1 && i != n2 && i != n3) {
								if (j != n1 && j != n2 && j != n3) {
									if (k != n1 && k != n2 && k != n3) {
										check[i * 100 + j * 10 + k]++;
									}
								}
							}
						}
					}
				}
			}
		}
	}
}

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

	bool flag = false;

	cin >> testcasenum;

	for (int i = 0; i < testcasenum; i++) {
		int tempnum, s, b;
		cin >> tempnum >> s >> b;
		if (s == 3) {
			flag = true;
		}
		testcase.push_back(make_pair(tempnum, make_pair(s, b)));
	}

	if (flag) {
		cout << 1;
	}
	else {
		for (int i = 0; i < testcasenum; i++) {
			solve(i);
		}
		
		int result = 0;
		for (int i = 0; i < 1000; i++) {
			if (check[i] == testcasenum) {
				result++;
			}
		}
		cout << result;
	}

	return 0;
}

0개의 댓글