백준

백준2503 - 숫자 야구

개발하는꼬마 2019. 8. 1. 12:44

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

 

2503번: 숫자 야구

첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트라이크 개수를 나타내는 정수와 볼의 개수를 나타내는 정수, 이렇게 총 세 개의 정수가 빈칸을 사이에 두고 주어진다.

www.acmicpc.net

어릴 때 하던 숫자야구를 코딩으로 바꾼 신선한 문제다. 사용자가 원하는 만큼 숫자와 숫자에 대한 스트라이크와 볼을 주면 해당 조건에 맞는 숫자들을 판별하여 최종적으로 몇 개의 숫자가 답일 수 있는지 개수를 출력하면 된다.

 

#include <iostream>
#include <set>
#include <string>
using namespace std;

int n; //원하는 입력 횟수
int strike, ball; //스트라이크, 볼
int checkstrike = 0, checkball = 0; //현재 숫자에 대한 스트라이크, 볼
string s; //string이지만 숫자를 입력
set<int> ans; //현재 숫자가 스트라이크와 볼 모두 적합한 숫자인지 판별하여 겹치는 것을 저장하는 공간

//숫자야구 판별함수
bool checkcnt(int j) {
	string check = to_string(j);
	
	//숫자가 중복되거나 숫자 0이 들어가면 거른다.
	if (check[0] == '0' || check[1] == '0' || check[2] == '0' || check[0] == check[1] || check[1] == check[2] || check[0] == check[2]) {
		return false;
	}

	//스트라이크와 볼의 갯수를 세는 곳
	if (check[0] == s[0]) {
		checkstrike++;
	}
	if (check[1] == s[1]) {
		checkstrike++;
	}
	if (check[2] == s[2]) {
		checkstrike++;
	}
	if (check[0] == s[1] || check[0] == s[2]) {
		checkball++;
	}
	if (check[1] == s[0] || check[1] == s[2]) {
		checkball++;
	}
	if (check[2] == s[0] || check[2] == s[1]) {
		checkball++;
	}

	return true;
}

int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> s >> strike >> ball;
		if (i == 1) { //처음 입력된 수는 온전히 조건에 맞게 숫자를 저장한다.
			for (int j = 111; j <= 999; j++) {
				if (checkcnt(j)) {
					if (strike == checkstrike && ball == checkball) { //입력된 조건과 같은 수이면
						ans.insert(j); //ans에 저장
					}
				}
				else {
					continue;
				}

				//초기화
				checkstrike = 0;
				checkball = 0;
			}
		}
		else { //처음 이외에 입력된 수는  ans에 현재 수가 있는지 판단하여 임시공간에 담아놓은 뒤 임시공간을 ans로 변경한다.
			set<int> temp;
			for (int j = 111; j <= 999; j++) {
				if (checkcnt(j)) {
					if (strike == checkstrike && ball == checkball) { //입력된 조건과 같은 수이면
						if (ans.find(j) != ans.end()) { //ans에 현재 수가 존재하면
							temp.insert(j); //temp에 저장
						}
					}
				}

				//초기화
				checkstrike = 0;
				checkball = 0;
			}
			ans = temp; //temp를 ans로 변경한다.
		}
	}

	cout << ans.size(); //마지막 ans의 크기는 결국 답에 갯수와 같다.
}