
- 영재가 같은 정답을 3번 이상 못쓰게 막아버리기
-> 같은 숫자가 3번 이상 안나오는 모든 조합 구하기- 각 조합마다 점수를 매겨 5점 이상인 조합은 카운트 + 1
// 메인 함수
public class Q19949_영재의_시험 {
static List<List<Integer>> young = new ArrayList<>();
static int answer = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int[] answerArr = new int[10];
for(int i=0; i<10; i++){
answerArr[i] = Integer.parseInt(st.nextToken());
}
dfs(new ArrayList<>());
checkScore(answerArr);
System.out.println(answer);
}
// 영재가 찍을 정답의 조합 구하기(백트래킹)
private static void dfs(List<Integer> list){
if(list.size() > 2
&& Objects.equals(list.get(list.size() - 1), list.get(list.size() - 2))
&& Objects.equals(list.get(list.size() - 2), list.get(list.size() - 3))
) return;
if(list.size() == 10){
young.add(new ArrayList<>(list));
return;
}
for(int i=1; i<=5; i++){
list.add(i);
dfs(list);
list.remove(list.size()-1);
}
}
같은 숫자가 연속 3번 나오는 경우를 리스트나 변수에 저장하면서 처리할 수 있겠지만,, 문제 풀 당시에 그냥 Objects.equals나오는게 신기해 사용해보고 싶었던거 같다 ㅎ,, 결과적으로 문제없이 실행은 되지만 멍청해보이는게 함정,,
// 각 조합별로 점수를 채점해 5점 이상일 시 카운트 +1해주는 메소드
private static void checkScore(int[] arr){
for(int i=0; i<young.size(); i++){
int score = 0;
for(int j=0; j<10; j++){
if(arr[j] == young.get(i).get(j)) score++;
}
if(score >= 5) answer++;
}
}