나만의 작은 도서관

문제 42840. 모의고사 본문

프로그래머스 문제풀이/코드카타

문제 42840. 모의고사

pledge24 2024. 6. 10. 09:42

문제 링크

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

 

프로그래머스

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

programmers.co.kr

 

 

난이도 : Lv.1

 

문제 요약 설명

3명의 수포자가 있을 때 각각 본인만의 패턴으로 문제를 찍는다. 3명 중 가장 높은 점수를 얻은 수포자를 반환하는 프로그램을 작성하시오. (각각 수포자는 1, 2, 3번이며, 가장 높은 점수가 여럿인 경우 오름차순으로 정렬한다.)

 

각 수포자가 찍는 방법

1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...

입력

  • 1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers

입력 제한

  • 시험은 최대 10,000 문제로 구성되어있습니다.
  • 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
  • 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.

입력 예제

// input
[1,2,3,4,5]

// ans
[1]

 

풀이 방식

  • 각 수포자의 찍는 패턴을 배열에 저장하고, 문제의 정답이 들어있는 answer를 순회하며, 각 수포자가 정답을 맞췄을 때 맞춘 횟수를 1 증가시킨다.
  • 패턴은 반복적으로 나타내는 규칙성이므로, 나머지 연산(%)를 이용해 배열을 반복적으로 순회한다.
  • 각 수포자가 맞춘 점수의 최대 점수를 max_element를 통해 가장 높은 점수를 얻고 가장 높은 점수를 얻은 수포자의 수를 구한다.

정답 코드 

더보기
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> solution(vector<int> answers) {
    vector<int> answer;
    
    vector<int> pattern1 = {1, 2, 3, 4, 5};
    vector<int> pattern2 = {2, 1, 2, 3, 2, 4, 2, 5};
    vector<int> pattern3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
    
    vector<int> score_list(3);
    int size_p1 = pattern1.size(), size_p2 = pattern2.size(), size_p3 = pattern3.size();
    int idx_p1 = 0, idx_p2 = 0, idx_p3 = 0;
    for(int elem : answers){
        score_list[0] += (pattern1[idx_p1] == elem);
        score_list[1] += (pattern2[idx_p2] == elem);
        score_list[2] += (pattern3[idx_p3] == elem);
        
        idx_p1 = (idx_p1 + 1) % size_p1;
        idx_p2 = (idx_p2 + 1) % size_p2;
        idx_p3 = (idx_p3 + 1) % size_p3;
    }
    
    int max_score = *max_element(score_list.begin(), score_list.end());
    
    for(int i = 0; i < 3; i++){
        if(max_score == score_list[i]){
            answer.push_back(i+1);
        }
    }
    return answer;
}

 

더 좋은 코드?

 

더 이상 좋은 코드는 딱히 생각이 나지 않는다.