[PROG] 42840 모의고사(완전탐색)

호호빵·2022년 10월 15일
0

Algorithm

목록 보기
34/46

문제

https://school.programmers.co.kr/learn/courses/30/lessons/42840


나의 풀이

import java.util.*;

class Solution {
    public ArrayList<Integer> solution(int[] answers) {
        ArrayList<Integer> answer = new ArrayList<>();

        int[] list1 = {1, 2, 3, 4, 5};
        int[] list2 = {2, 1, 2, 3, 2, 4, 2, 5};
        int[] list3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};

        HashMap<Integer, Integer> map = new HashMap<>();
        int a = 0;
        int b = 0;
        int c = 0;

        for (int i = 0; i < answers.length; i++) {
            map.put(1, a);
            if (list1[i % 5] == answers[i]) {
                a += 1;
                map.put(1, a);
            }
        }

        for (int i = 0; i < answers.length; i++) {
            map.put(2, b);
            if (list2[i % 8] == answers[i]) {
                b += 1;
                map.put(2, b);
            }
        }

        for (int i = 0; i < answers.length; i++) {
            map.put(3, c);
            if (list3[i % 10] == answers[i]) {
                c += 1;
                map.put(3, c);
            }
        }
        
        if (map.get(1) == map.get(2) && map.get(1) == map.get(3)) {
            answer.add(1);
            answer.add(2);
            answer.add(3);
        } else {
            List<Integer> list_map = new ArrayList<>(map.keySet());
            list_map.sort((o1, o2) -> map.get(o2).compareTo(map.get(o1)));

            answer.add(list_map.get(0));
        }

        return answer;
    }
}
  • map으로 처리하여 value로 sort하고 해당값을 도출하려고 했는데
    엉켜버렸고, 가장 큰 값을 가지는 방식을 도출해내기 어려웠다.
    (정답 x)

다른 풀이

import java.util.*;

class Solution {
    public ArrayList<Integer> solution(int[] answers) {
        ArrayList<Integer> answer = new ArrayList<>();

        int[] list1 = {1, 2, 3, 4, 5};
        int[] list2 = {2, 1, 2, 3, 2, 4, 2, 5};
        int[] list3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};

        int[] count = {0, 0, 0};       // list1, 2, 3의 정답 수

        for (int i = 0; i < answers.length; i++) {
            if (list1[i % 5] == answers[i]) {         // 값이 같을때마다 count += 1
                count[0] += 1;
            }

            if (list2[i % 8] == answers[i]) {
                count[1] += 1;
            }

            if (list3[i % 10] == answers[i]) {
                count[2] += 1;
            }
        }

        int[] arr = new int[count.length];      
        for (int i = 0; i < arr.length; i++) {
            arr[i] = count[i];
        }

        Arrays.sort(arr);                         // 1, 2, 3의 count를 정렬하여 저장

        for (int i = 0; i < arr.length; i++) {    // 최댓값과 같은 수만 저장
            if (count[i] == arr[2]) {
                answer.add(i+1);
            }
        }

        return answer;
    }
}

  • 수포자들의 정답을 로테이션 돌리기보다는 [i % 5]의 index를 가지는 값으로
    정답과 비교
  • count 배열, count를 정렬한 arr 배열, 최대값과 같은 값만을 넣어 저장하는 answer배열을 적절히 활용하였다.
    (map으로 한번에 처리하려고 하였는데 오래걸리고 복잡하고.... 배열을 여러번 사용하더라도 직관적인 풀이를 생각해보아야겠다)



모의고사 - 참고 풀이

profile
하루에 한 개념씩

1개의 댓글

comment-user-thumbnail
2022년 10월 16일

한 주 정말 수고했어요~~
다음주도 화이팅!

답글 달기