https://www.acmicpc.net/problem/2503
문제
복붙이 귀찮은데 걍 세자리 노중복 숫자야구
민혁이의 물음들과 각각의 물음에 대한 영수의 답이 입력으로 주어질 때 영수가 생각하고 있을 가능성이 있는 답의 총 개수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트라이크 개수를 나타내는 정수와 볼의 개수를 나타내는 정수, 이렇게 총 세 개의 정수가 빈칸을 사이에 두고 주어진다.
출력
첫 줄에 영수가 생각하고 있을 가능성이 있는 답의 총 개수를 출력한다.
숫자 중복이 없다고 했으므로 123~987까지의 노중복 세자리숫자 중 가능한 후보를 찾는다
탐색할 숫자가 많지 않으므로 쌩반복문을 돌아 완전탐색으로 풀 수 있다.
일단 다 후보로 설정(true)해두고, 스트라이크/볼 조건에 따라 후보가 될 수 있는지 여부를 판단한다. 스트라이크는 자리와 숫자가 모두 같을 때, 볼은 숫자는 같지만 자리가 다를 때로 비교할 숫자들을 문자열로 바꿔준 뒤 각 자리를 비교해준다.
전체 코드
/******************************************************************************
Online C++ Compiler.
Code, Compile, Run and Debug C++ program online.
Write your code in this editor and press "Run" button to compile and execute it.
*******************************************************************************/
#include <iostream>
#include <vector>
using namespace std;
vector<bool> ans;
pair<int,int> checkCand(int i, int m){
int tmp_s=0;
int tmp_b=0;
string tmp = to_string(i);
string cmp = to_string(m); //입력받은 숫자
//숫자와 자리까지 같으면 스트라이크
for(int j=0;j<3;j++){
if(tmp[j] == cmp[j]) tmp_s++;
//숫자만 같고 자리가 다르면 볼
for(int k=0;k<3;k++){
if(j!=k && tmp[j]==cmp[k]) tmp_b++;
}
}
return {tmp_s, tmp_b};
}
int main()
{
int n, m, s, b;
ans.assign(1001, true);
for(int i=123; i<=987;i++){
string tmp = to_string(i);
//후보가 될 수 없는 것은 처음부터 제외
//0이 포함된 수 & 중복 숫자가 존재하는 경우
if(tmp[0]==tmp[1] || tmp[1]==tmp[2] || tmp[2]==tmp[0]){
ans[i] = false;
}
if(tmp[0]-'0'==0 || tmp[1]-'0'==0 || tmp[2]-'0'==0){
ans[i] = false;
}
}
cin >> n;
while(n--){
cin >> m >> s>> b;
for(int i=123;i<=987;i++){
pair<int,int> tmp_cnt;
//하나씩 확인하며 부른 숫자와 비교했을 때 스트라이크/볼 개수 세기
if(ans[i]){ //후보가 될 수 있는 숫자일 때만 확인
tmp_cnt = checkCand(i,m);
}
//수가 같지 않으면 후보에서 제외
if(tmp_cnt.first!=s || tmp_cnt.second!=b) ans[i] = false;
}
}
int res = 0;
for(int i=123;i<=987;i++){
if(ans[i]) res++;
}
cout<<res;
return 0;
}
'알고리즘' 카테고리의 다른 글
BOJ: 별자리 만들기(4386) [C++] (0) | 2024.06.30 |
---|---|
BOJ: 최소 스패닝 트리(1197) [C++] (0) | 2024.06.29 |
BOJ: 친구비(16562) [C++] (0) | 2024.06.26 |
BOJ: 트리 (4803) [C++] (0) | 2024.06.25 |
BOJ: 집합의 표현(1717) [C++] (0) | 2024.06.24 |