#문제
https://www.acmicpc.net/problem/2503
#작성 코드
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, 1000, true);
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 |