숫자야구
다음에서 직접 해볼수 있다. https://scratch.mit.edu/projects/131352991/
JAVA 로 구현하기
[[123, 1, 1], [356, 1, 0], [327, 2, 0], [489, 0, 1]]
[제출값 , strike, ball] 이 다음과같이 주어질때, 정답으로 가능한 숫자들을 제시해주도록 하겠다.
기본적으로 앞선 도출값을 통해 정답이 될수 있는 수들을 DFS 탐색을 통해 리스트로 찾은뒤 마찬가지로 다음 도출값들에서도 리스트 추출해내어 리스트를 필터링하면서 정답을 찾아나가는 방식으로 진행한다.
class Solution {
int questionCount = 0;
List<Integer> resultList = new ArrayList<>();
List<Integer> tempList = new ArrayList<>();
public int solution(int[][] baseball) {
int answer = 0;
getList(baseball);
for(int el : resultList){
System.out.println(el);
}
answer = resultList.size();
return answer;
}
public void getList(int[][] arr){
for(int[] question : arr){
int[] num = {question[0]/100, (question[0]/10)%10, question[0]%10};
int strike = question[1];
int ball = question[2];
boolean[] visited = new boolean[9];
int[] result = new int[3];
questionCount++;
dfs(num, visited, result, 0, strike, ball);
if(questionCount == 1){
resultList = new ArrayList<Integer>(tempList);
}else{
resultList = resultList.stream().filter(e-> tempList.contains(e)).collect(Collectors.toList());
}
tempList.clear();
}
}
public void dfs(int[] num, boolean[] visited, int[] result,int pivot, int strike, int ball){
for(int i=0; i<9; i++){
if(pivot == 3){
int tempStrike=0 , tempBall=0;
for(int j=0; j<3 ;j++){
for(int k=0; k<3; k++){
if(result[k]==num[j] ){
if(k==j) tempStrike ++;
else tempBall++;
break;
}
}
}
if(tempStrike == strike && tempBall == ball){
String resultStr = "";
for(int el : result){
resultStr += Integer.toString(el);
}
tempList.add(Integer.parseInt(resultStr));
}
break;
}
if(!visited[i]){
visited[i] = true;
result[pivot] = i+1;
dfs(num, visited, result, pivot+1, strike, ball);
visited[i] = false;
}
}
}
}