프로그래머스 - 모의고사

이형석·2024년 6월 11일

알고리즘 Phase1

목록 보기
40/59

이것도 전 문제인 최소직사각형과 마찬가지로 bfs알고리즘을 사용하지 않는 1레벨 완전탐색 문제였다.
모듈러 연산자를 사용하는 핵심 알고리즘은 바로 떠올릴 수 있었지만, 출력조건인 "가장 높은 점수를 받은 사람이 여럿일 경우 오름차순하여 return' 부분을 떠올리기 어려웠다.
3명 밖에 안되므로 억지로 짜려면 짤 순 있었지만, 다른 풀이를 참고하기로 했다.

풀이
1. 문제 정답 배열에 수포자의 반복되는 정답배열을 순서대로 비교하고, 수포자의 정답배열크기를 넘어가는 시점부터 모듈러연산자를 이용해 계속해서 비교해준다.
2. 먼저 3명 중 최댓값을 구하고, 그 최댓값과 같은 값을 가진 수포자를 순서대로 answer[]에 넣어 return한다.

import java.util.*;
class Solution {
    public int[] solution(int[] answers) {
        Queue<Integer> q = new LinkedList();
        //answers가 주어짐
        //1번 대입하여 맞은수 체크
        //2번 대입하여 맞은수 체크
        //3번 대입하여 맞은수 체크
        //젤 많이맞은사람 return, 여러명이면 오름차순으로 같이 return
        int p1a = 0;
        int p2a = 0;
        int p3a = 0;
        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};
        //p1
        for(int i = 0; i < answers.length; i++){
            int ans = p1[i%p1.length];
            if(answers[i] == ans){
                p1a++;
            }
        }
        //p2
        for(int i = 0; i < answers.length; i++){
            int ans = p2[i%p2.length];
            if(answers[i] == ans){
                p2a++;
            }
        }
        //p3
        for(int i = 0; i < answers.length; i++){
            int ans = p3[i%p3.length];
            if(answers[i] == ans){
                p3a++;
            }
        }
        //최댓값구하고, 그거랑 같은 애 출력
        int max = Math.max(p1a, Math.max(p2a, p3a));
        if(p1a == max) {
            q.add(1);
        }
        if(p2a == max) {
            q.add(2);
        }
        if(p3a == max) {
            q.add(3);
        }
        int[] answer = new int[q.size()];
        int i = 0;
        while(!q.isEmpty()){
            answer[i++] = q.poll();
        }
        return answer;
    }
}

실수
1. 최댓값과 같은 수포자를 Queue에 추가할 때 굳이 for(i<3)문에 넣어서 3번 반복하게 만든 실수
2. while(isEmpty()) answer[i++] = ? 에서 answer[i]로 쓴 실수
3. i%n.length를 i%5로 쓴 실수

profile
금융IT 개발자

0개의 댓글