코테/프로그래머스

99클럽 코테 스터디 20일차 TIL 완전탐색(모의고사)

zsunny 2024. 11. 16. 13:28

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

<아이디어>

우선 삼인방의 답이 반복되니 반복되는 구간을 1차원 배열에 지정했다.

값으로 들어온 정답 배열과 비교해서 각 삼인방의 정답개수를 저장해둔다.

정답개수를 탐색하며 최댓값(동점 포함)을 구한다.

이 최댓값을 가진 사람의 번호를 저장해 리턴한다.

 

<문제>

처음에 제출하고 런타임에러가 엄청 났는데, 알고보니...

삼인방 정답을 확인할 때, 단순히 p1[i] 형식으로 비교하고 있었다..

각 삼인방의 배열의 크기가 지정되어 있기에 들어오는 answers 배열의 크기에 따라 범위를 벗어날 수 있다

따라서 i%삼인방배열 크기 로 지정해주었다. (각 삼인방 배열의 크기를 넘어가면 다시 [0~삼인방 배열 크기]로 돌아가도록)

 

<제출코드>

import java.util.*;

class Solution {
    public int[] solution(int[] answers) {
        int[] answer = {};
        int len = answers.length;
        int maxS = Integer.MIN_VALUE;
        
        int[] p1 = {1, 2, 3, 4, 5};
        int[] p2 = {2, 1, 2, 3, 2, 4, 2, 5};
        int[] p3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
        
        int[] sol = new int[3];
        for(int i=0; i<len; i++){
            // 삼인방 정답 확인
            if(answers[i] == p1[i%5]) sol[0] += 1;
            if(answers[i] == p2[i%8]) sol[1] += 1;
            if(answers[i] == p3[i%10]) sol[2] += 1;
        }
        int cnt = 1;
        for(int i=0; i<3; i++){
            // 고득점자 확인
            if(maxS == sol[i]) cnt++;
            maxS = Math.max(maxS, sol[i]);
        }
        answer = new int[cnt];
        int idx = 0;
        for(int i=0; i<3; i++){
            if(sol[i] == maxS) answer[idx++] = i + 1;
        }
        return answer;
    }
}