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

SJ·2021년 1월 19일
0

코딩테스트

목록 보기
4/8
post-thumbnail

📌 문제설명

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

📇 입출력 예

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

💡 풀이

import java.util.*;
class Solution {
    public static int[] solution(int[] answers) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        
        int[] first = {1,2,3,4,5};
        int[] second = {2,1,2,3,2,4,2,5};
        int[] third = {3,3,1,1,2,2,4,4,5,5};
        
        int[] scores = {0,0,0}; // 수포자들 답 맞은 개수
        // 비교
        for(int i = 0; i < answers.length; i++){
            if(first[i % 5] == answers[i]){ scores[0]++;}
            if(second[i % 8] == answers[i]){ scores[1]++;}
            if(third[i % 10] == answers[i]){ scores[2]++;}
        }
        
        int[] arr = new int[scores.length];
        for(int i = 0; i < scores.length; i++){
            arr[i] = scores[i];
        }
        
        Arrays.sort(arr);
        
        for(int i = 0; i < arr.length; i++){
            if(scores[i] == arr[2]){
                list.add(i+1);
            }
        }
        
        int[] answer = new int[list.size()];
        for(int i = 0; i < list.size(); i++){
            answer[i] = list.get(i);
        }
        
        return answer;
    }
}

💻 알고리즘

👉 수포자들이 답을 찍는 패턴이 담긴 배열과 수포자들의 정답을 저장할 배열(scores)를 생성한다.
👉 수포자들의 답과 실제 답을 비교해 맞은 개수를 배열(scores)에 저장한다.
👉 scores배열을 새로운 배열인 arr로 복사한다.
👉 제일 많이 맞은 개수를 알기 위하여 arr을 오름차순으로 정렬한다. 그러면 가장 많이 맞은 정답 개수는 arr[2]에 담기게 된다.
👉 수포자 1,2,3의 정답 개수가 순서대로 있는 배열 scores랑 arr[2]를 비교하여 같으면 scores 배열의 인덱스+1값을 최종 답이되는 answer 배열에 담는다.

👩‍💻 후기

코테 푼게 얼마 없어서 그런가 지금까지 풀었던 것중에 제일 어려웠던 것 같다. 처음에 일차원적으로 생각해 풀었었다. 3명의 수포자들의 답이 들어있는 배열을 만들때 크기를 정답배열의 크기만큼 만들어 다 정수로 채워넣었다. 또 answer배열에 제일 많이 맞춘 수포자를 넣을 때도 하나하나 다 비교했다. 정답은 맞췄지만 역시 런타임에러가 떴었다.
그래서 질문하기를 살짝 보고 풀었다. 사람들이 푼 것을 보고 '이렇게 하면 간단한 것을!!'이라는 생각이 들었다.

이 문제에서 인상깊었던 코드는 수포자 배열을 int[] first = {1,2,3,4,5}; 이런 식으로 만들고 if(first[i % 5] == answers[i]) 이렇게 비교하는 것과 수포자들의 정답개수가 담겨져 있는 배열을 정렬하여 최대값을 알아내고 비교한 것이다.

이 문제를 풀면서 정말 많이 부족하고 앞으로 코테를 더 많이 풀어봐야겠다는 생각을 하게 되었다. 🤯

profile
Front-end

0개의 댓글