소스코드는 Github에서도 확인하실 수 있습니다.
풀이 🚀
1~9까지 중복되지 않는 세자리 수만 가능하므로, 123 ~ 987까지 모두 순회하며 주어진 조건을 모두 만족하는지 확인한다.
주어진 조건
* Input으로 들어온 수와 strike, ball 수를 비교했을 때 같다.
* 1~9까지 중복되지 않는 세자리 수로 이루어져있다.
모든 조건을 만족한다면 가능한 답에 포함되므로 answer를 1 증가시킨다.
소스코드 👩🏻💻
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
List<BaseBallData> inputDatum = new ArrayList<>();
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
inputDatum.add(
new BaseBallData(st.nextToken(), Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()))
);
}
System.out.println(playBaseBall(inputDatum));
}
private static int playBaseBall(List<BaseBallData> inputDatum) {
int answer = 0;
// 1~9까지 서로 다른 숫자 3개
for (int number = 123; number <= 987; number++) {
if (hasSameOrContainsZero(number)) {
continue;
}
int allCasePass = 0;
for (BaseBallData baseBallData : inputDatum) {
final String source = baseBallData.number;
final String target = String.valueOf(number);
// strike 개수 확인
final int strike = countStrike(source, target);
// ball 개수 확인
final int ball = countBall(source, target);
// baseBallData와 일치하는지 확인
if (strike == baseBallData.strike && ball == baseBallData.ball) {
allCasePass++;
} else {
break;
}
}
if (allCasePass == inputDatum.size()) {
answer++;
}
}
return answer;
}
private static int countStrike(String source, String target) {
int strike = 0;
for (int i = 0; i < 3; i++) {
if (source.charAt(i) == target.charAt(i)) {
strike++;
}
}
return strike;
}
private static int countBall(String source, String target) {
int ball = 0;
for (int i = 0; i < 3; i++) {
if (source.charAt(i) == target.charAt((i + 1) % 3) ||
source.charAt(i) == target.charAt((i + 2) % 3)) {
ball++;
}
}
return ball;
}
private static boolean hasSameOrContainsZero(int number) {
String sNumber = String.valueOf(number);
Set<Character> chars = new HashSet<>();
for (int i = 0; i < sNumber.length(); i++) {
chars.add(sNumber.charAt(i));
}
return chars.contains('0') || chars.size() != 3;
}
static class BaseBallData {
String number;
int strike;
int ball;
public BaseBallData(String number, int strike, int ball) {
this.number = number;
this.strike = strike;
this.ball = ball;
}
}
}