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

ByWindow·2020년 10월 3일
0

Algorithm

목록 보기
3/104
post-thumbnail

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 = [1,2,3,4,5] --> return == [1]
  • answers = [1,3,2,4,2] --> return == [1,2,3]

2. 아이디어

각 수포자의 규칙을 살펴보면,
1번 수포자는 {1,2,3,4,5}
2번 수포자는 {2,1,2,3,2,4,2,5}
3번 수포자는 {3,3,1,1,2,2,4,4,5,5} 가 반복된다.
따라서 answers의 배열 크기만큼 각 수포자의 정답 배열을 만들어 줄 필요없이
각각 index%5, index%8, index%10 으로 접근하면 된다.


크기가 3인 배열을 만들어 각 수포자가 맞힌 문제의 개수를 기록한다.
수포자가 맞힐 때마다 해당 인덱스의 값을 1 증가하면 된다.


위에서 정의한 배열을 clone한다. 굳이 copy가 clone을 하는 이유는 뒤에서 오름차순으로 정렬할 때 각 요소의 값이 변경이 될 수 있는데 copy를 하면 복사본과 원본 배열의 값이 모두 변경될 수 있어서 깊은 복사를 하기 위해 clone함수를 사용했다.


3. 코드

public class math {
    
    public static int[] mathForegiver(int[] answers){

        int[] m1 = {1,2,3,4,5};//수포자1의 규칙
        int[] m2 = {2,1,2,3,2,4,2,5};//수포자2의 규칙
        int[] m3 = {3,3,1,1,2,2,4,4,5,5};//수포자3의 규칙
        int[] cnt = {0,0,0};//각 수포자가 맞힌 문제의 개수
        for(int i = 0; i<answers.length;i++){
            if(answers[i] == m1[i%5]) cnt[0]++;
            if(answers[i] == m2[i%8]) cnt[1]++;
            if(answers[i] == m3[i%10]) cnt[2]++;
        }
        int[] c_cnt = cnt.clone();//배열의 복제 clone()
        Arrays.sort(c_cnt);//복제한 배열을 오름차순으로 정렬
        List<Integer> man = new ArrayList<>();//각 수포자를 순위 매기는 배열
        for(int i =0; i <3; i++){
            if(c_cnt[2]==cnt[i]) man.add(i+1);//i+1로 수포자를 표현
        }
        int[] answer = new int[man.size()];
        for(int i =0;i<answer.length;i++){
            answer[i] = man.get(i);
        }
        
        return answer;
    }
    
    
    
    public static void main(String[] args) {
        int[] arr = {1,3,2,4,2};
        int[] sol = mathForegiver(arr);
        for(int i : sol){
            System.out.print(i + " ");
        }
        System.out.println("");
    }
}

4. end..

더 많이 맞춘 사람을 찾고 순위 매기는 방법이 좀 복잡하지만 이것밖에 떠오르지 않는다.
copyclone의 차이점을 숙지하고 앞으로 둘을 잘 활용하자...!

profile
step by step...my devlog

0개의 댓글