Lv1 - 수포자

Birdie·2023년 2월 1일

https://school.programmers.co.kr/learn/courses/30/lessons/42840

프로그래머스 Lv1

문제 제목 : 수포자

문제

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

1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...

1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한 사항

시험은 최대 10,000 문제로 구성되어있습니다.
문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.

입출력 예

answerreturn
[1,2,3,4,5][1]
[1,3,2,4,2][1,2,3]

풀이


public class MathFail {

    public int[] solution(int[] answers) {
        int[] answerA = {1, 2, 3, 4, 5};
        int[] answerB = {2, 1, 2, 3, 2, 4, 2, 5};
        int[] answerC = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5,};

        int answerACount = 0;
        int answerBCount = 0;
        int answerCCount = 0;

        for (int i = 0; i < answers.length; i++) {
            int answer = answers[i];

            if (answerA[i % answerA.length] == answer) {
                answerACount++;
            }

            if (answerB[i % answerB.length] == answer) {
                answerBCount++;
            }

            if (answerC[i % answerC.length] == answer) {
                answerCCount++;
            }
        }

        int maxNum = Math.max(answerACount, Math.max(answerBCount, answerCCount));

        List<Integer> answerList = new ArrayList<>();

        if (maxNum == answerACount) {
            answerList.add(1);
        }
        if (maxNum == answerBCount) {
            answerList.add(2);
        }
        if (maxNum == answerCCount) {
            answerList.add(3);
        }

        int[] answerArr = new int[answerList.size()];

        for (int i = 0; i < answerArr.length; i++) {
            answerArr[i] = answerList.get(i);
        }

        return answerArr;

    }


}

1,2,3 번의 찍은 정답의 규칙대로 배열 생성
for 문을 돌리며 정답의 i 번째와, 1 2 3번의 정답 배열 i 번째를 비교한다.
i 가 찍은 정답의 길이보다 길어질 수 있으므로, i % 찍은정답길이 를 해준다.

Math.max 를 이용해서 정답의 최댓값을 구하고,
max 와 같은 값을 List 에 추가해준다.

1, 2, 3 순서대로 List 에 더햐줬으므로, 정렬을 추가로 하지 않고
answerArr 배열을 만들어서 답을 추가해준다.

2주 전쯤 푼 문제를 코쿼 알고리즘으로 다시 풀어봤는데, 변수명 깔끔하게 했다는 점을 제외하고 크게 개선된 점이 없다. 코드를 더 깔끔하게 작성할 수 있도록 노력해야겠다.


어제 람다 스트림을 공부했음에도 불구하고, 오늘 사용하지 못했다.
문제 풀이 후 다른 사람들의 코드를 보니
마지막 List 를 Array로 바꿀 때 스트림을 사용했다면 더 깔끔하게 코드를 작성할 수 있었을텐데, 배운 것을 적용하도록 더 노력해야겠다.

0개의 댓글