자바 알고리즘

[알고리즘] 프로그래머스 - 모의고사

Big Iron 2023. 2. 18. 13:19

문제를 확인하고 어떤 방법으로 풀어야 하나 생각을 해봤다.
가장 먼저 1번, 2번, 3번 수포자가 찍는 방식에 규칙이 존재했고 각각 5번 8번 10번씩 숫자가 반복 되는 것 이었다.

    int[] answer = new int[3]; // 수포자들이 각각 문제를 맞춘 개수가 들어갈 배열 (수포자가 3명이기에 길이는3)
    int[] arr = {}; // 정답이 들어갈 배열

    int[] case1 = {1,2,3,4,5};
    int[] case2 = {2,1,2,3,2,4,2,5};
    int[] case3 = {3,3,1,1,2,2,4,4,5,5};

그래서 각각의 배열을 만들어 문제를 찍는 규칙을 담아줬고
이 배열과 값을 넣어주는 answers 배열의 값이 일치하는 갯수를 찾는 순서가 필요했다.

    for (int i=0; i<answers.length; i++) {
        if (case1[i%case1.length] == answers[i]) {answer[0]++;} // 인풋 배열의 순서와 수포자들의 찍는 순서가 몇개 일치하는지 확인 > 각각의 번호에 저장
        if (case2[i%case2.length] == answers[i]) {answer[1]++;} 
        if (case3[i%case3.length] == answers[i]) {answer[2]++;}
    }

    int max = Math.max(answer[0], Math.max(answer[1], answer[2]));

문제에서 요구하는 조건이 가장 많은 문제를 맞춘 사람의 번호를 return 하는 것이었기에
max 변수를 만들고 수포자 배열의 각 위치에 값을 넣어줬다.
그리고 각 인덱스 값을 비교해 정답 배열로 옮겨주면 끝.

if (max == answer[0] && max == answer[1] && max == answer[2]) {
            arr = new int[]{1, 2, 3};
            return arr;
        } else if (max == answer[0] && max == answer[1]) {
            arr = new int[]{1, 2};
            return arr;
        } else if (max == answer[1] && max == answer[2]) {
            arr = new int[]{2, 3};
            return arr;
        } else if (max == answer[0]) {
            arr = new int[]{1};
            return arr;
        } else if (max == answer[1]) {
            arr = new int[]{2};
            return arr;
        }
        arr = new int[]{3};
        return arr;

코드 실행을 눌러보고 통과하는 줄 알았지만 채점하는 과정에 실패가 있었다.

그래서 문제 되는 부분을 찾아보고 있는데 사실 아직까지 해결하지 못했고

조금 더 효율적인 코드를 생각해 봐야 할 것 같다.