반응형
728x170
이것도 어렵다.
사실 BruteForce문제는 어렵다.
우리 머리 속에서 생략한 계산을 표현할 줄 알아야 하기 때문이다.
우리는 왜 숫자야구를 할 수 있을까?
왜 이것은 후보가 아닐까를..? 표현할 수 있어야 한다.
알아보자
https://www.acmicpc.net/problem/2503
#맞는 풀이
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int N; // 주어진 힌트 수
bool num[1001];
int main(){
cin >> N;
fill(num, num+1001, true); // 처음엔 숫자모르니까 다 정답의 후보
//하지만 같은 숫자가 있으면 후보가 될 수 없음.
for (int i = 100; i <= 999; i++)
{
string temp = to_string(i);
//중복되는 숫자가 있으면
if (temp[0] == temp[1] || temp[0] == temp[2] || temp[1] == temp[2]){
num[i] = false;
continue;
}
//0은 있으면 안됨
if (temp[0] - '0' == 0 || temp[1] - '0' == 0 || temp[2] - '0' == 0){
num[i] = false;
continue;
}
}
for(int i = 0; i<N; i++){
int n;
int st,b;
cin >> n >> st >> b;
string s = to_string(n); // 정답을 가리는 기준
//서로 다른 숫자인 세자리 숫자.(숫자가 중복되는 후보는 위에서 걸러짐)
for(int i = 100; i<=999; i++){
//만약 후보 중에서 비교해봄
if(num[i]){
string compare = to_string(i); //비교대상(세자리 숫자)
int compSt = 0;
int compB = 0;
for (int x = 0; x < 3; x++) {
for (int y = 0; y < 3; y++) {
//1. 자리도 같고 숫자도 같은지
if (x == y && s[x]==compare[y]){
compSt ++;
continue;
}
//2. 자리는 다른데 숫자는 같은지.
if (x != y && s[x] == compare[y]){
compB++;
continue;
}
}
}
//해당 후보가 후보인지 체크 -> 스트라이크나 볼이 다르면 후보가 아님
if (st != compSt || b != compB){
num[i] = false; //후보 탈락
continue; // 다음 숫자
}
}
}
}
int ans = 0;
for(int i = 100; i<=999; i++){
if(num[i])ans++;
}
cout << ans;
return 0;
}
전수조사는 생략된 우리 머릿속의 생각까지
쓸 수 있어야 하기 때문에 정말 어렵다.
쉬우면서도 어렵다.
728x90
반응형
그리드형
'문제풀이(Problem Solving)' 카테고리의 다른 글
백준, BOJ, 16637번, 괄호추가하기 : C++ [CPP] (0) | 2021.12.06 |
---|---|
백준, BOJ, 1543번, 문서 검색 : C++ [CPP] (0) | 2021.12.05 |
백준, BOJ, 1120번, 문자열 : C++ [CPP] (0) | 2021.12.04 |
백준, BOJ, 1937번, 욕심쟁이 판다 : C++ [CPP] *** (0) | 2021.12.01 |
백준, BOJ, 1194번, 달이 차오른다 가자 4 : C++ [CPP] ****** (0) | 2021.12.01 |