#문제

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

 

2503번: 숫자 야구

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

www.acmicpc.net

 

#작성 코드

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
#include <iostream>
using namespace std;
 
int n[101][3];        // t의 최대값이 100이므로 101을 사용. 
bool nums[1000];
 
int main(){
    int t, answer=0;
    fill_n(nums, 1000true); 
    cin>>t;
    // t개의 입력을 받는다. 수, 스트라이크, 볼 
    for(int i=0; i<t; i++){
        cin>>n[i][0]>>n[i][1]>>n[i][2];
    }
    
    for(int num=123; num<=999; num++){ 
        int n1=num/100, n2=(num/10)%10, n3=num%10;
        // 숫자야구에서 발생할 수 없는 num에 대해서는 false 체크하고 다음 num으로 넘어간다.
        if( n1==0 || n2==0 || n3==0 || n1==n2 || n1==n3 || n2==n3 ){
            nums[num]=false;
            continue;
        }
        
        for(int i=0; i<t; i++){
            int x = n[i][0];
            int x1=x/100, x2=(x/10)%10, x3=x%10;
            int nowst=0, nowba=0;
            // 입력받은 x에 대해 strike, ball 판정 받는 케이스를 탐색.
            // 위치와 숫자가 같은 경우 strike 
            if( x1 == n1 ) nowst++;
            if( x2 == n2 ) nowst++;
            if( x3 == n3 ) nowst++;
            // 같은 숫자가 다른 위치에 있는 경우 ball 
            if( x1==n2 || x1==n3 ) nowba++;
            if( x2==n1 || x2==n3 ) nowba++;
            if( x3==n1 || x3==n2 ) nowba++;
             
            // 현재 입력에 대한 strike, ball개수와 탐색한 strike, ball개수가 동일하지 않다면 num은 가능성이 없는 숫자. 
            if( nowst!=n[i][1|| nowba!=n[i][2] ) {
                nums[num]=false;        // 현재 입력으로 가능성이 있는 수는 false체크 
            }
        }
    }
    
    for(int num=123; num<=999; num++){
        // 가능성이 있는 num의 개수를 센다. 
        if( nums[num]==true ) {
            answer++;
        }
    }
    cout<<answer<<'\n';
    return 0;
}
 
cs

##

예제에서 주어진 수들을 탐색한 후에 324는 체크가 되었는데, 328이 체크가 안되어서 로직을 계속 살펴봤다.

결국 문제가 있던 부분은 ball을 판정하는 과정에서 x2==n1|| x2==n3이어야 하는데 x2대신 n2를 써놓고 왜 안되지? 하는 중이었다.

변수가 코드 속에 있을 때 한 눈에 잘 구분할 수 있도록 이름지어야겠다. n2와 x2는 너무 닮았어...

'BOJ' 카테고리의 다른 글

BOJ 3078번 :: 좋은 친구  (0) 2020.02.10
BOJ 1182번 :: 부분수열의 합  (0) 2020.02.06
BOJ 10448번 :: 유레카 이론  (0) 2020.02.04
BOJ 3085번 :: 사탕 게임  (0) 2020.02.04
BOJ 2309번 :: 일곱 난쟁이  (0) 2020.02.03

+ Recent posts