https://www.acmicpc.net/problem/2503
이 문제는, 예전 인턴할 때 4자리 야구를 풀어본 기억이 있다.
숫자 야구는 워낙 유명한 게임이니 자세한 설명은 생략하겠다.
여기서 핵심은, 민혁이가 물어본 숫자를 가지고 어떻게 이용할 것인지가 핵심이다.
민혁이가 물어본 숫자는 오답일 것이다. (3S는 안줄것이니)
그 오답의 스트라이크 횟수와 볼의 횟수에 주목해야 하는데,
어떤 후보 숫자 중에서, 그 오답과 동일한 스트라이크 횟수와 볼의 횟수를 가지고 있다면,
이 것은 정답의 후보가 된다.
처음 나도 이 사실을 알았을 때, 직관적으로 이해가 되지 않았다.
이해를 돕기 위해서 생각해볼 수 있는 것은,
후보숫자가 오답보다 볼의 횟수가 더 작거나 크면?
후보숫자가 오답보다 스트라이크의 횟수가 더 작거나 크면?
두 가지다.
여기서, 또 생각해야 할 것은, 벡터에 저장된 후보 숫자들을 지울 때 erase 함수의 반환 값이 다음 원소의 iterator를 가진다는 것을 유념해야 한다.
해설코드(C++).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
int N;
int num, S, B;
int answer = 0;
vector<int> v;
bool compare(int n, int s, int b, int comp){
int arr1[3];
int arr2[3];
int idx = 2;
while(idx != -1){
arr1[idx] = n % 10;
n /= 10;
arr2[idx] = comp % 10;
comp /= 10;
idx -= 1;
}
int tmp_s = 0, tmp_b = 0;
for(int i = 0; i < 3; i++){
for(int j = 0; j < 3; j++){
if(arr1[i] == arr2[j]){
if(i == j)
tmp_s += 1;
else
tmp_b += 1;
}
}
}
return (s == tmp_s && b == tmp_b);
}
int main() {
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)
continue;
v.push_back((100 * i) + (10 * j) + k);
}
}
}
ㅁ
cin >> N;
for(int i = 1; i <= N; i++){
cin >> num >> S >> B;
for(vector<int>::iterator it = v.begin(); it != v.end(); ){
if(!compare(num, S, B, *it) == true){
it = v.erase(it);
}else
it++;
}
}
cout << v.size() << endl;
return 0;
}
|
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ 1541] 잃어버린 괄호 (0) | 2020.06.04 |
---|---|
[BOJ 2533] 사회망 서비스(SNS) (0) | 2020.06.02 |
[BOJ 10448] 유레카 이론 (0) | 2020.05.31 |
[BOJ 10610] 30 (배수판정법 참고) (0) | 2020.05.31 |
[BOJ 2217] 로프 (0) | 2020.05.30 |