import java.io.*;
import java.util.*;
public class Main {
static BufferedReader br;
static StringTokenizer st;
static int N;
static int[] arr;
static int[][] states;
static boolean[] nums;
static int res;
public static void main(String[] args) throws IOException {
input();
solve();
System.out.println(res);
}
static void input() throws IOException {
br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
arr = new int[N];
states = new int[N][2];
nums = new boolean[1000];
for(int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
arr[i] = Integer.parseInt(st.nextToken());
states[i][0] = st.nextToken().charAt(0) - '0';
states[i][1] = st.nextToken().charAt(0) - '0';
}
}
static void solve() {
//0 제거, 중복 제거, 입력으로 들어온 값 제거, 입력값들과 s, b이 일치하지 않는 값 제거
for(int i = 123; i <= 987; i++) {
String num = String.valueOf(i);
char[] chars = num.toCharArray();
if(chars[0] != chars[1] && chars[0] != chars[2] && chars[1] != chars[2]) {
if(chars[0] != '0' && chars[1] != '0' && chars[2] != '0') {
int sameCnt = 0;
for(int j = 0; j < N; j++) {
String source = String.valueOf(arr[j]);
int s = countStrike(num, source);
int b = countBall(num, source);
if(s == states[j][0] && b == states[j][1]) {
sameCnt++;
}
}
if(sameCnt == N) {
nums[i] = true;
} else {
nums[i] = false;
}
}
}
}
//true인 값 세기
for(int i = 123; i <= 987; i++) {
if(nums[i]) {
res++;
}
}
}
static int countStrike(String target, String source) {
int cnt = 0;
for(int i = 0; i < 3; i++) {
if(target.charAt(i) == source.charAt(i)) {
cnt++;
}
}
return cnt;
}
static int countBall(String target, String source) {
int cnt = 0;
for(int i = 0; i < 3; i++) {
if(target.charAt(i) == source.charAt((i+1)%3)) {
cnt++;
}
if(target.charAt(i) == source.charAt((i+2)%3)) {
cnt++;
}
}
return cnt;
}
}
구현 + 완전 탐색 문제이다.
문제에 주어진 두가지 조건을 먼저 제거한다.
1. 중복되는 수가 없는 수(123 ~ 987)
2. 0이 없는 수
그리고 그 수 중에서 input으로 주어진 수와 스트라이크, 볼의 개수가 모두 동일하면 정답일 가능성이 있는 수이기 때문에 브루트 포스로 조건 탐색 후 true인지 false인지 정해주면 된다.
처음엔 왜 풀이를 보고도 이해가 안되나 했는데 곰곰히 생각해보니 모든 input의 수는 정답과 비교한 것이니 target 수와 input의 모든 수를 비교한 것이 정답과 비교한 것과 일치한다면 그것은 논리적으로 가능성이 있는 수가 된다. 이런 것이 빠르게 떠올라야 문제도 빨리 풀텐데 ㅜ
'Dev > PS' 카테고리의 다른 글
[백준] 17626 Four Squares java (0) | 2022.06.28 |
---|---|
[백준] 2442 한윤정이 이탈리아에 가서 아이스크림을 사먹는데 (0) | 2022.06.27 |
[백준] 1969 DNA java (0) | 2022.06.22 |
[백준] 15721 번데기 java (0) | 2022.06.22 |
[백준] 21942 부품 대여장 java (0) | 2022.06.16 |