본문 바로가기

문제 풀이/Programmers

[프로그래머스] 모의고사 (JAVA)

문제 출처 - Programmers

문제는 여기

 

코딩테스트 연습 - 모의고사

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는

programmers.co.kr


[풀이]

1. 2차원 배열에 각 사람들의 답을 찍는 방식을 담아준다.

2. 정답과 2차원 배열에 담겨있는 각 사람들이 찍는 값이 일치하는 치 비교 후 일치하면 점수를 증가시켜준다.

3. 모든 문제에 맞춰서 2를 반복한다.

4. 점수 중에서 최고점을 구한다.

5. 최고점이 몇 개가 될지 모르니까 ArrayList를 사용해 최고값일 경우 다 담아준다.

6. list의 값들을 배열에 담아준다.

7. 결과를 출력한다.

[접근]

1. 사람들마다 문제를 찍는 방식이 다른데 이를 배열에 넣어서 정답과 비교 처리하면 되겠다고 생각하였다.

[코드]

import java.util.*;

class Solution {
    public int[] solution(int[] answers) {
        int[][] check = {{1, 2, 3, 4, 5}, {2, 1, 2, 3, 2, 4, 2, 5}, {3, 3, 1, 1, 2, 2, 4, 4, 5, 5}};
        int[] score = new int[3];
        
        // 문제를 맞출때마다 score 증가
        for (int i = 0; i < answers.length; i++) {
            // i % check[0].length 를 통해 문제 수가 더 많을 경우도 반복 처리 가능
            if (answers[i] == check[0][i % check[0].length]) {
                score[0]++;
            }
            if (answers[i] == check[1][i % check[1].length]) {
                score[1]++;
            }
            if (answers[i] == check[2][i % check[2].length]) {
                score[2]++;
            }
        }
        
        // 최고값을 구하기
        int max = Math.max(score[0], Math.max(score[1], score[2]));
        
        // 최고값이 몇개가 될 지 몰라서 리스트를 만들어 넣어준 후 처리
        ArrayList<Integer> list = new ArrayList<>();
        
        // 3명이므로 3번 반복
        for (int i = 0; i < 3; i++) {
            // 최고점과 같은 경우에 리스트에 추가
            if (score[i] == max)
                list.add(i);
        }
        
        // 정답 출력
        int[] answer = new int[list.size()];
        int idx = 0;
        
        for (int a : list) {
            // 0,1,2로 들어가기 때문에 1증가
            answer[idx++] = a + 1;
        }
        
        return answer;
    }
}