백준 Q19949 영재의 시험

손정민·2024년 1월 14일


로직 설계

  1. 영재가 같은 정답을 3번 이상 못쓰게 막아버리기
    -> 같은 숫자가 3번 이상 안나오는 모든 조합 구하기
  2. 각 조합마다 점수를 매겨 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++;
    }
}
profile
코린이의 성장교실

0개의 댓글