- 난이도: 실버 5
- 알고리즘: 브루트포스 알고리즘
아이디어 자체는 그렇게 어렵진 않았다. 모든 숫자들마다 스트라이크, 볼 개수가 같지 않은 케이스를 제거하여 마지막에 남은 숫자의 개수를 출력하면 된다. 마치 아리스토텔레스의 체를 만드는 듯한 기분이 들었다.
string vec[900] <- vector<string> vec
처음에 접근할 때는 vector로 문제를 풀다가 계속 빌드가 안되서 왜 그런가 했더니 벡터의 iterator 접근이 문제가 있었다. 벡터의 값들이 반복문으로 돌아가는 와중에 erase를 해서 계속 에러가 났던 것이다. 그래서 임시로 다른 벡터를 만들고 해당 원소를 find한 후 그 iterator에 있는 값을 삭제하려고 했는데 또 에러가 계속 났다.
아무리 해도 해결이 안되길래 일반 배열로 바꿔서 하니까 너무 쉽게 풀렸다...
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
string vec[900];
int cou = 0;
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
for (int k = 1; k <= 9; k++) {
if (i != j && j != k && k != i)
vec[cou++] = (to_string(i * 100 + j * 10 + k));
}
}
}
int n;
cin >> n;
for (int i = 0; i < n; i++) {
string x;
int s, b;
cin >> x >> s >> b;
for (int t = 0; t < cou; t++) {
string y = vec[t];
int sy = 0;
int by = 0;
// strike 좌표들 저장
int arr[3] = { 1,1,1 };
for (int j = 0; j < 3; j++) {
if (x[j] == y[j]) {
sy++;
arr[j] = 0;
}
}
for (int j = 0; j < 3; j++) {
if (arr[j]) {
int num = x[j];
if (y[0] == num && j != 0) by++;
if (y[1] == num && j != 1) by++;
if (y[2] == num && j != 2) by++;
}
}
if (sy != s || by != b)
vec[t] = "000";
}
}
int count = 0;
for (int i = 0; i < cou; i++) {
if (vec[i] != "000") count++;
}
cout << count;
}