본문 바로가기

컴퓨터/프로그래머스

프로그래머스 - 42840번: 모의고사 [Java]

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1. 코드

import java.util.*;
class Solution {
    public ArrayList <Integer> solution(int[] answers) {
        ArrayList <Integer> answer = new ArrayList<>();
        int[][] p = {
            {1, 2, 3, 4, 5},
            {2, 1, 2, 3, 2, 4, 2, 5},
            {3, 3, 1, 1, 2, 2, 4, 4, 5, 5}
        };
        int[] score = new int[3];
        int best = 0;
        for(int i = 0; i < answers.length; i++) {
            for(int j = 0; j < p.length; j++) {
                if(p[j][i % p[j].length] == answers[i]) {
                    score[j]++;
                    best = Math.max(best, score[j]);
                }
            }
        }
        
        for(int i = 0; i < score.length; i++) {
            if(score[i] == best)
                answer.add(i + 1);
        }
        return answer;
    }
}

2. 설명

int[][] p = {
    {1, 2, 3, 4, 5},
    {2, 1, 2, 3, 2, 4, 2, 5},
    {3, 3, 1, 1, 2, 2, 4, 4, 5, 5}
};

수포자의 패턴을 가져와서 2차원 배열로 만들어줍니다.

int[] score = new int[3];
int best = 0;
for(int i = 0; i < answers.length; i++) {
    for(int j = 0; j < p.length; j++) {
        if(p[j][i % p[j].length] == answers[i]) {
            score[j]++;
            best = Math.max(best, score[j]);
        }
    }
}

score에는 수포자들의 점수를 저장합니다. 이중 반복문을 통해서 수포자가 선택한 답과 문제의 답이 같으면 해당 수포자의 점수를 증가시키고 best에는 수포자들 중 가장 높은 점수를 저장하는 것이기에 Math.max()를 활용하여 최고 점수를 저장해줍니다.

for(int i = 0; i < score.length; i++) {
    if(score[i] == best)
        answer.add(i + 1);
}

최고의 점수를 보유하고 있는 수포자들을 추가해주고 반환하면 문제는 해결됩니다.

3. 정리

  1. 수포자들의 패턴 배열로 저장
  2. % 연산자로 문제에 맞는 정답 선택
  3. 최고 점수를 가진 수포자들 선택
출처: 프로그래머스 코딩 테스트 연습, 
https://school.programmers.co.kr/learn/challenges