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

·2023년 1월 19일
0

프로그래머스

목록 보기
22/59

📌 문제 설명

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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하는 값을 오름차순 정렬해 주세요.

📌 입출력 예

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

📌 코드

import java.util.*;

class Solution {
    public int[] solution(int[] answers) {
       int[] answer;
        int []type1 = {1,2,3,4,5};
        int []type2 = {2,1,2,3,2,4,2,5};
        int []type3 = {3,3,1,1,2,2,4,4,5,5};
        int [] count = new int[3];
        ArrayList<Integer> p1 = new ArrayList<>();
        ArrayList<Integer> p2 = new ArrayList<>();
        ArrayList<Integer> p3 = new ArrayList<>();
        for(int i = 0; i < answers.length; i++){
            p1.add(type1[i % type1.length]);
            p2.add(type2[i % type2.length]);
            p3.add(type3[i % type3.length]);
        }
        for(int i = 0; i < answers.length; i++){
            if(answers[i] == p1.get(i)) count[0]++;
            if(answers[i] == p2.get(i)) count[1]++;
            if(answers[i] == p3.get(i)) count[2]++;
        }
        int max = -1, maxIndex = 0, num = 1;
        for(int j = 0; j < count.length; j++){
            if(max < count[j]){
                max = count[j];
                maxIndex = j;
            }
            if(max == count[j] && maxIndex != j)
                num++;
           }
        answer = new int[num];
        int index = -1;
        for (int i = 0; i < count.length; i++){
            if(max == count[i])
                answer[++index] = i + 1;
        }
        return answer;
    }
}

솔직히 통과할 줄 몰랐는데 돼서 놀랐다... 🤩

📌 문제 해결 과정

💡 배열 type1, type2, type3에 1, 2, 3번 수포자들이 찍는 방식을 담았고, ArrayList를 만들어 문제 수 (answers.length)만큼 담아 주었다 i를 각각 찍기 타입의 길이만큼 나눈 나머지로 type 배열들의 인덱스를 나타내 줄 수 있으며 문제 수 만큼 찍기 타입을 반복해 각각의 ArrayList에 넣어 주었다

💡 수포자 1, 2, 3들이 찍은 것과 정답이 들어 있는 배열의 원소가 같다면 count 배열의 원소들에 +1을 해 준다

💡 반복문을 통해 제일 많이 맞힌 count 값과 제일 많이 맞힌 수포자의 번호를 저장해 주게 되는데, 이때 만약 제일 많이 맞힌 count 값을 가진 수포자가 또 있다면 num에 +1을 해 준다 (numanswer 배열의 사이즈를 결정하기 위한 것이며 초기에는 1로 초기화되어 있다)

💡 마지막 반복문으로 answermax값과 같은 count[i]값을 넣어 주게 된다 이런 방식으로 한 이유는 자동으로 오름차순으로 번호가 들어가게 되며 또, max값이 2개 이상 있는 경우를 생각해서 index를 통해 인덱스를 조절하며 answer에 수포자 번호로 넣어 주었다 ❕

profile
공부는 많은 양을 하진 않더라도 꾸준히 매일 하기

0개의 댓글