백준
백준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의 크기는 결국 답에 갯수와 같다.
}