//백준 2503 숫자야구
#pragma warning(disable:4996)
#include<stdio.h>
#include<iostream>
#include<vector>
#include <string>
#include <tuple>
#include<cstring>
using namespace std;
struct inputData
{
int question;
int strike;
int ball;
};
int n;
inputData* arr = new inputData[n];
bool checkIn[987];
void input() {
int tmp;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i].question);
scanf("%d", &arr[i].strike);
scanf("%d", &arr[i].ball);
}
}
int main() {
//chekIn-> 1로 초기화
memset(checkIn, 1, sizeof(checkIn));
input();
string check;
string checkList;
int checkStrike = 0;
int checkBall=0;
//n개의 질문에대하여
//k[123~987] 까지의 질문에 대하여 각각 비교해보고 끝까지 true남은 것만 답으로 체크
for (int i = 0; i < n; i++) {
for (int k = 123; k <= 987; k++) {
//현재 질문의 숫자와 k 번째 숫자의 질문을 비교
check=to_string(arr[i].question);
checkList = to_string(k);
//k번째 숫자에 대한 strike와 boll을 확인
for (int m = 0; m < 3; m++) {
for (int a = 0; a < 3; a++) {
if (check[m] == checkList[a]) {
if (m == a) checkStrike++;
if (m != a) checkBall++;
}
}
}
//srike와 boll이 같지 않은 숫자는 경우의 수에서 삭제 (false)
if (arr[i].strike != checkStrike || arr[i].ball != checkBall)
checkIn[k] = 0;
//다음의 k번째 수를 체크하기위해 다시 0으로 초기화 해놓는다.
checkStrike = 0;
checkBall = 0;
}
//한 n번째 질문에 대하여 123~987 까지의 숫자를 비교해본 결과
}
//n개 질문 모두에 대하여 숫자를 대입하여 check(bool)로 상태를 체크한 결과
//같은 숫자가 한번 더 들어갔거나 0이 들어간 숫자를 모두 제외시킴
for (int i = 123; i < 987; i++)
{
string tmp = to_string(i);
if (tmp[0] == tmp[1] || tmp[0] == tmp[2] || tmp[1] == tmp[2])
checkIn[i] = 0;
if (tmp[0] - '0' == 0 || tmp[1] - '0' == 0 || tmp[2] - '0' == 0)
checkIn[i] = 0;
}
//true인 경우의 수를 체크
int Answer = 0;
for (int i = 123; i <= 987; i++)
{
if (checkIn[i] == 1) Answer++;
}
printf("%d", Answer);
return 0;
}
'알고리즘' 카테고리의 다른 글
[BAEKJOON 1182번] (C++) 부분수열의 합 (0) | 2020.09.01 |
---|---|
[BAEKJOON 3085번] (C++) 사탕 게임 (0) | 2020.09.01 |
[BAEKJOON 2309번] (C++) 일곱 난쟁이 (0) | 2020.08.31 |
[PROGRAMMERS/Level2] (C++) 스킬트리 (0) | 2020.07.08 |
[PROGRAMMERS/Level2] (C++) 탑 (0) | 2020.07.07 |