BOJ

백준 2503 - 숫자 야구

yanJuicy 2019. 6. 1. 15:01
반응형

문제

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

 

2503번: 숫자 야구

첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트라이크 개수를 나타내는 정수와 볼의 개수를 나타내는 정수, 이렇게 총 세 개의 정수가 빈칸을 사이에 두고 주어진다.

www.acmicpc.net

 

풀이

숫자 야구를 푸는 알고리즘은 크게 2가지가 있다.

1. 배열에 숫자들을 넣고 조건과 비교해서 조건과 맞지 않는 숫자들을 제거

2. 123부터 시작해서 조건과 맞는 숫자 후보들을 증가

 

배열에 숫자를 넣을 경우 0이 들어가거나 중복되는 수가 들어가는 것은 빼야한다. 배열에 숫자를 넣은 후 문제에 조건과 맞지 않는 숫자들을 제거하고 배열에 남은 수를 출력하면 된다.

코드

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
68
69
70
71
72
73
74
75
76
77
78
#include <iostream>
 
using namespace std;
 
int N;
int game[988];
int num;
int s, b;
int result;
 
// 스트라이크
int getS(int num, int cmp)
{
    int strike = 0;
    if ((num / 100== (cmp / 100)) strike++;
    if ((num % 100 / 10== (cmp % 100 / 10)) strike++;
    if (num % 10 == cmp % 10) strike++;
    return strike;
}
 
// 볼
int getB(int num, int cmp)
{
    int ball = 0;
    int firstA = num / 100, firstB = cmp / 100;
    int secondA = num % 100 / 10, secondB = cmp % 100 / 10;
    int thirdA = num % 10, thirdB = cmp % 10;
 
    if (firstA == secondB || firstA == thirdB) ball++;
    if (secondA == firstB || secondA == thirdB) ball++;
    if (thirdA == firstB || thirdA == secondB) ball++;
 
    return ball;
}
 
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);
 
    cin >> N;
 
    // 중복되거나 0이 들어간 수 제거
    for (int i = 123; i <= 987; i++)
    {
        int i1 = i / 100;
        int i2 = i % 100 / 10;
        int i3 = i % 10;
 
        if (i2 == 0 || i3 == 0 || i1 == i2 || i1 == i3 || i2 == i3) game[i] = 0;
        else game[i] = i;
    }
 
    // 조건과 비교
    for (int i = 0; i < N; i++)
    {
        cin >> num >> s >> b;
        for (int x = 123; x <= 987; x++)
        {
            if (!game[x]) continue;
 
            int cs = getS(x, num);
            int cb = getB(x, num);
 
            if (!((cs == s) && (cb == b))) game[x] = 0;
        }
    }
 
    for (int i = 123; i <= 987; i++)
    {
        if (game[i]) result++;
    }
 
    cout << result;
 
    return 0;
}
 
cs
반응형

'BOJ' 카테고리의 다른 글

백준 1904 - 01타일  (0) 2019.06.05
백준 1700 - 멀티탭 스케줄링  (0) 2019.06.03
백준 2178 - 미로 탐색  (0) 2019.05.31
백준 2644 - 촌수계산  (0) 2019.05.30
백준 2193 - 이친수  (0) 2019.05.26