본문 바로가기

코딩테스트

프로그래머스 - 모의고사완전탐색

제가 작성한 풀이.. 실력도 없지만 자고 일어나서 딱 풀려고 하니 그냥 기능구현에만 매진한 것이 보이긴 한다..

public ArrayList<Integer> solution(int[] answers) {
        ArrayList<Integer> answerList = new ArrayList<>();


        int[] p1 = {1, 2, 3, 4, 5};
        int[] p2 = {2, 1, 2, 3, 2, 4, 2, 5};
        int[] p3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};

        int num1 = 0;
        int num2 = 0;
        int num3 = 0;

        int match1 = 0;
        int match2 = 0;
        int match3 = 0;

        for (int ans : answers) {
            if (ans == p1[num1]) {
                match1++;
            }
            if (ans == p2[num2]) {
                match2++;
            }
            if (ans == p3[num3]) {
                match3++;
            }
            num1++;
            num2++;
            num3++;

            if (num1 >= p1.length) {
                num1 = 0;
            }
            if (num2 >= p2.length) {
                num2 = 0;
            }
            if (num3 >= p3.length) {
                num3 = 0;
            }
        }

        int max = Integer.MIN_VALUE;

        for (int maxAns : new int[]{match1, match2, match3}) {
            max = Math.max(max, maxAns);

            if (max == match1) {
                answerList.add(1);
            }
            if (max == match2) {
                answerList.add(2);
            }
            if (max == match3) {
                answerList.add(3);
            }
        }

        return answerList;
    }

 

 

개선한 코드

public ArrayList<Integer> solution(int[] answers) {
        ArrayList<Integer> answerList = new ArrayList<>();


        int[] p1 = {1, 2, 3, 4, 5};
        int[] p2 = {2, 1, 2, 3, 2, 4, 2, 5};
        int[] p3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};

        int[] matches = new int[3]; // 각 수포자가 맞춘 문제 수

        for (int i = 0; i < answers.length; i++) {
            if (answers[i] == p1[i % p1.length]) {
                matches[0]++;
            }
            if (answers[i] == p2[i % p2.length]) {
                matches[1]++;
            }
            if (answers[i] == p3[i % p3.length]) {
                matches[2]++;
            }
        }

        int max = Math.max(matches[0], Math.max(matches[1], matches[2]));

        for (int i = 0; i < matches.length; i++) {
            if (matches[i] == max) {
                answerList.add(i + 1); // 수포자 번호는 1부터 시작하므로 i + 1
            }
        }

        return answerList;
    }

각 배열을 다시 처음으로 돌아가서 시작하는걸 나머지를 통해 구현한 것이 보인다.. 다음에는 저렇게 하도록 해보자.