ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 > 완전탐색 > 모의고사
    기타/알고리즘 2021. 9. 22. 21:33

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

     

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

     

    아래 코드는 절반만 통과

     public static int[] solution(int[] answers) {
            int hit1=0, hit2=0, hit3=0;
            int [] num1 = { 1, 2, 3, 4, 5};
            int [] num2 = { 2, 1, 2, 3, 2, 4, 2, 5};
            int [] num3 = { 3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
            int num1Len = num1.length;
            int num2Len = num2.length;
            int num3Len = num3.length;
    
            int len = answers.length;
            for(int i=0;i<len;i++){
                if(num1[i%num1Len]==answers[i]){
                    hit1++;
                }
                if(num2[i%num2Len]==answers[i]){
                    hit2++;
                }
                if(num3[i%num3Len]==answers[i]){
                    hit3++;
                }
            }
            int [] answer  = {hit1,hit2,hit3};
            Arrays.sort(answer);
            List<Integer> list = new ArrayList<>();
    
            for(int i=0;i<answer.length;i++){
                if(answer[i]>=answer[answer.length-1]){
                    list.add(i+1);
                }
            }
            int[] finalarr = new int[list.size()];
            for(int i = 0; i < list.size(); i++){
                finalarr[i] = list.get(i);
            }
            
            return finalarr;
        }

    아래 코드는 100% 통과..

    위에서 정답 맞춘 수를 가진 answer  {5,5,4} 를 정렬하고 {4,5,5} 가 됐을 때 가장 큰 수인 answer[2]와 비교할 대상을 

    answer 로 잡은 것이 잘못된 생각이였다.

    정렬한 것은 max 점수를 갖기 위한 것일 뿐, 정렬 전 {5,5,4}는 학생1,학생2,학생3 각각의 스코어기 때문에 학생들 점수는 따로 copy 해 놓고 비교 대상으로 삼아야한다.

     

     public static int[] solution(int[] answers) {
            int hit1=0, hit2=0, hit3=0;
            int [] num1 = { 1, 2, 3, 4, 5};
            int [] num2 = { 2, 1, 2, 3, 2, 4, 2, 5};
            int [] num3 = { 3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
            int num1Len = num1.length;
            int num2Len = num2.length;
            int num3Len = num3.length;
    
            int len = answers.length;
            for(int i=0;i<len;i++){
                if(num1[i%num1Len]==answers[i]){
                    hit1++;
                }
                if(num2[i%num2Len]==answers[i]){
                    hit2++;
                }
                if(num3[i%num3Len]==answers[i]){
                    hit3++;
                }
            }
            int [] answer  = {hit1,hit2,hit3};
            Arrays.sort(answer);
            List<Integer> list = new ArrayList<>();
    
            for(int i=0;i<answer.length;i++){
                if(answer[i]>=answer[answer.length-1]){
                    list.add(i+1);
                }
            }
            int[] finalarr = new int[list.size()];
            for(int i = 0; i < list.size(); i++){
                finalarr[i] = list.get(i);
            }
            
            return finalarr;
        }

     

    처음에는 % 를 이용해 비교할 생각을 못하고 

    매개변수 answer 의 길이만큼 학생 답안 패턴 길이를 늘이려고 했다. 

    몇 개 소수 문제 빼고 모두 시간 초과를 받았다.

    public int[] solution2(int[] answers) {
            int hit1=0;
            int hit2=0;
            int hit3=0;
    
            List<Integer> list1 =  Arrays.asList(1,2,3,4,5); //List.of(1,2,3,4,5);UnsupportedOperationException / (ImmutableCollections.java:71)
    
            while(list1.size()<answers.length) {
                List<Integer> result = new ArrayList<>();
                result.addAll(list1);
                list1 = result ;
            }
            List<Integer> list2 = Arrays.asList(2,1,2,3,2,4,2,5);
            while(list2.size()<answers.length) {
                List<Integer> result = new ArrayList<>();
                result.addAll(list2);
                list2 = result ;
            }
            List<Integer> list3 = Arrays.asList(3,3,1,1,2,2,4,4,5,5);
            while(list3.size()<answers.length) {
                List<Integer> result = new ArrayList<>();
                result.addAll(list3);
                list3 = result ;
            }
    
            
            for(int i=0;i<answers.length;i++ ) {
                if(answers[i]==list1.get(i)) {
                    hit1++;
                }
                if(answers[i]==list2.get(i)) {
                    hit2++;
                }
                if(answers[i]==list3.get(i)) {
                    hit3++;
                }
            }
    
            List<Integer> ans = new ArrayList<>();
            if(hit1>0) {
                ans.add(1);
            } 
            if (hit2>0) {
                ans.add(2);
            } 
            if (hit3>0) {
                ans.add(3);
            } 
    
            int [] answer = ans.stream().mapToInt(Integer::intValue).toArray();
        
            return answer;
        }
    반응형

    '기타 > 알고리즘' 카테고리의 다른 글

    뒤집은소수  (0) 2022.03.09
    에라토스테네스의 체  (0) 2022.03.09
    다이나믹  (0) 2021.09.13
    순열 > 재귀  (0) 2021.09.12
    완전 탐색 문제  (0) 2021.09.07
Designed by Tistory.