본문 바로가기

알고리즘/백준

[BOJ 2503] 숫자 야구

https://www.acmicpc.net/problem/2503

 

2503번: 숫자 야구

첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트��

www.acmicpc.net

 

이 문제는, 예전 인턴할 때 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 == 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