반응형
brute force로 푼 문제였습니다.
풀이방법
1. 111부터 999까지 loop를 돕니다. 같은 숫자인 경우나 0을 포함하는 경우는 건너뜁니다.
2. 질문에 나온 수로 ball과 strike의 개수를 세줍니다. 한 질문에 대한 ball이나 strike개수가 다르다면 답이 될 수 없으므로 flag를 세워줍니다.
3. 모든 질문에 대한 ball과 strike개수가 같다면(if(!flag)) 답입니다.
4. 조건에 만족하는 cnt를 반환한 뒤 출력합니다.
Code
#include <bits/stdc++.h>
using namespace std;
int num[1001][3];
int n;
int hasSameNum(string num){
for(int i = 0; i < num.size(); i++)
for(int j = i + 1; j < num.size(); j++)
if(num[i] == num[j]) return 1;
return 0;
}
int isZero(string num){
for(int i = 0; i < num.size(); i++)
if(num[i]=='0') return 1;
return 0;
}
int getStrike(string num, string answer, int check[]){
int strike = 0;
for(int k = 0; k < 3; k++)
if(num[k] == answer[k]) strike++, check[k] = 1;
return strike;
}
int getBall(string num, string answer, int check[]){
int ball = 0;
for(int k = 0; k < 3; k++)
for(int t = 0; t < 3; t++)
if(!check[t] && !check[k] && k!=t && num[k]==answer[t])
ball++;
return ball;
}
int candidateNum(){
int cnt = 0;
for(int i = 111; i <= 999; i++){
string answer = to_string(i);
if(isZero(answer)) continue;
if(hasSameNum(answer)) continue;
int flag = 0;
for(int j = 0; j < n; j++){
string stringNum = to_string(num[j][0]);
int check[3] ={0,0,0};
int strike = getStrike(stringNum,answer,check);
int ball = getBall(stringNum,answer,check);
if(strike != num[j][1] || ball != num[j][2]){
flag = 1;
break;
}
}
if(!flag) cnt++;
}
return cnt;
}
int main(){
cin >> n;
for(int i = 0; i < n; i++)
cin >> num[i][0] >> num[i][1] >> num[i][2];
cout << candidateNum();
}
'Algorithm > Brute Force' 카테고리의 다른 글
(C++) - 백준(BOJ) 1062번 : 가르침 (0) | 2021.05.13 |
---|---|
(C++) - 백준(BOJ) 4641 : Doubles (0) | 2021.05.05 |
(C++) - 백준(BOJ) 10448번 : 유레카 이론 (0) | 2021.02.19 |
(C++) - 백준(BOJ) 17825번 : 주사위 윷놀이 (0) | 2021.02.17 |
(C++) - 프로그래머스(고득점 kit - 완전탐색) : 까펫 (0) | 2021.02.16 |