글 작성자: beaniejoy

프로그래머스 코딩테스트 연습 - 완전탐색 / 모의고사 (https://programmers.co.kr/learn/courses/30/lessons/42840)

 

코딩테스트 연습 - 모의고사 | 프로그래머스

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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,

programmers.co.kr

1, 2, 3번 수포자의 찍는 규칙을 보면 특정 패턴이 반복됨을 알 수 있습니다. 반복되는 패턴을 전부 integer 배열로 만들어서 할 수도 있는데 저는 괜히 복잡하게 만들어서 혼란만 가중시키는 것 같네요...

 

이번 문제는 가장 많이 맞춘 사람들만 반환하는 것이기 때문에 그나마 다행인데 한 개 이상 맞춘 수포자를 맞춘 개수로 내림차순 정렬해서 반환하는 것도 생각해봤는데 상당히 어렵더라구요... 고민해봐야할 또 다른 문제인 것 같습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
class Solution {
    public int[] solution(int[] answers) {
        int[] answer = {};
        
        int[] student2 = {1,3,4,5};
        int[] student3 = {3,1,2,4,5};
        int stu2_idx = 0;
        int stu3_idx = 0;
        
        int one_right=0;
        int two_right=0;
        int three_right=0;
        
        for(int i = 0; i < answers.length; i++){
            if(answers[i] == (i % 5+ 1){
                one_right++;
            }
            
            if(i % 2 == 0){
                if(answers[i] == 2){
                    two_right++;
                }
                stu3_idx = (i / 2) % 5;
            } else{
                stu2_idx = ((i - 1/ 2) % 4;
                if(answers[i] == student2[stu2_idx]){
                    two_right++;
                }
            }
            if(answers[i] == student3[stu3_idx]){
                three_right++;
            }
        }
        
        int max_point = 0;
        if(max_point < one_right){
            max_point = one_right;
        }
        if(max_point < two_right){
            max_point = two_right;
        }
        if(max_point < three_right){
            max_point = three_right;
        }
        if(max_point == 0) {return new int[]{};}
        if(max_point == one_right && max_point == two_right && max_point == three_right){
            return new int[]{1,2,3};
        } else if(max_point == one_right && max_point == two_right){
            return new int[]{1,2};
        } else if(max_point == two_right && max_point == three_right){
            return new int[]{2,3};
        } else if(max_point == one_right && max_point == three_right){
            return new int[]{1,3};
        } else if(max_point == one_right){
            return new int[]{1};
        } else if(max_point == two_right){
            return new int[]{2};
        }      
        
        return new int[]{3};
    }
}