02
06

문제

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.
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가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

 

제한 조건

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

코드

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

using namespace std;

vector<int> solution(vector<int> answers) {
    vector<int> answer;
    vector<int> student1 = { 1, 2, 3, 4, 5 };
    vector<int> student2 = { 2, 1, 2, 3, 2, 4, 2, 5 };
    vector<int> student3 = { 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 };
    vector<int> temp(3);
    
    for (int i = 0; i < answers.size(); i++)
    {
        if (student1[i%student1.size()] == answers[i]) temp[0]++;
        if (student2[i%student2.size()] == answers[i]) temp[1]++;
        if (student3[i%student3.size()] == answers[i]) temp[2]++;
    }
    
    int maxnum = *max_element(temp.begin(), temp.end());
    if (maxnum == temp[0])
    {
        answer.push_back(1);
    }
    if (maxnum == temp[1])
    {
        answer.push_back(2);
    }
    if (maxnum == temp[2])
    {
        answer.push_back(3);
    }
    
    
    return answer;
}

코드해설

수포자 3명의 답을 저장한 3개의 벡터를 만들어준다. 그리고 점수를 저장할 벡터 temp를 하나 만들어 준다.

 

for문으로 정답이 들어있는 answers의 벡터의 크기 만큼 돌면서, if문으로 각 수포자의 정답과 answers의 정답이 맞다면 정답의 갯수를 늘려준다.

if문의 조건문은 각 벡터마다 사이즈가 다르니 i의 값에서 각 수포자들의 답변의 크기 만큼 나눈것의 나머지 값을 출력하게 한다. 벡터의 첫 시작값이 0이라는 것을 고려해야된다.

 

그리고 max_element로 각 수포자들이 정답을 맞춘 횟수가 저장된 벡터에서 제일 큰 값을 저장한다.

if 문으로 가장 큰 값이 저장된 값과 각 수포자들의 정답 횟수를 비교해서 동일하면 answer에 값을 넣어주면 된다.

COMMENT