본문 바로가기
코딩일기/알고리즘

[프로그래머스 : 레벨1] 모의고사 (Java)

by 욱파이어니어 2021. 6. 8.
728x90
반응형

이번 문제는 레벨1이라 그런지 쉬웠다.

그래도 최대값 구하는 부분에 정렬 함수를 쓰지 않고 직접 구현해봐서 그런지 소스가 조금 길다.

그것 말고는 다른 사람들과 별 차이가 없는것 같다.

 

문제 설명

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

입출력 예

answers return
[1,2,3,4,5] [1]
[1,3,2,4,2] [1,2,3]

 

입출력 예 설명

입출력 예 #1

  • 수포자 1은 모든 문제를 맞혔습니다.
  • 수포자 2는 모든 문제를 틀렸습니다.
  • 수포자 3은 모든 문제를 틀렸습니다.

따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다.

입출력 예 #2

  • 모든 사람이 2문제씩을 맞췄습니다.

 

나는 각각의 수포자들의 패턴을 배열에 담아서 나머지 연산을 이용해 각각의 정답에 접근하게 하였다.

 

import java.util.*;
class Solution {
    public int[] solution(int[] answers) {
        int[] answer = {};
        
        //일단 찍는 각각의 찍는 방식에 대한배열을 만들어야함
        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[] answerCount = {0,0,0};
        
        for(int i = 0; i< answers.length;i++){
            int l1 = p1.length;
            int l2 = p2.length;
            int l3 = p3.length;
            
            if(answers[i] == p1[i%l1]){
                answerCount[0] += 1;
            }
            if(answers[i] == p2[i%l2]){
                answerCount[1] += 1;
            }
            if(answers[i] == p3[i%l3]){
                answerCount[2] += 1;
            }            
        }
        int max = 0;
        List<Integer> li = new ArrayList<>();
        for(int i = 0; i< answerCount.length; i++ ){
            if(i == 0){
                max = answerCount[i];
                li.add(i+1);
            }else if(max == answerCount[i]){ //다음수랑 같을때
                li.add(i+1);
            }else if(max < answerCount[i]){
                max = answerCount[i];
                li.clear();
                li.add(i+1);
            }
        }
        answer = new int[li.size()];
        for(int i = 0; i<li.size(); i++){
            answer[i] = li.get(i);
        }
        
        return answer;
    }
}

그리고 각각의 정답수를 받고 나서는 최대값만 뽑기위해서 아래와 같이 List를 사용해서 많이 맞춘 애들만 List에 담았다.

 

느낀점

1. 문제를 자세히 읽어보자.

반응형