[PROGRAMMERS] 모의고사(Level1)

모의고사(Level1)

  • 문제 링크: 코딩테스트 연습 > 완전탐색 > 모의고사

  • 문제 이해

    1. 1번 수포자, 2번 수포자, 3번 수포자 모두 같은 패턴을 반복하며 찍습니다.
    2. 5지선다의 답안지에서 각 수포자가 찍어서 맞은 개수를 세고, 가장 높은 점수의
      사람들을 answer에 넣습니다.
  • 알고리즘 구현

    1. 1번 수포자는 5문제마다, 2번 수포자는 8문제마다, 3번 수포자는 10문제마다 같은
      패턴을 반복합니다. (인덱스가 0~4, 0~7, 0~9 범위 내에 있음을 알 수 있습니다.)
    2. 어떤 패턴으로 찍는지 각 학생에 대한 벡터를 만듭니다.
    3. answers의 모든 인덱스의 값을 비교하며 각 학생이 맞춘 문제를 기록합니다.
      1을 만족시키기 위해, 이를 위해 나머지 연산을 사용하며 비교합니다.
  • 알고리즘

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> solution(vector<int> answers) {
    vector<int> answer;
    vector<int> stdA{1, 2, 3, 4, 5};
    vector<int> stdB{2, 1, 2, 3, 2, 4, 2, 5};
    vector<int> stdC{3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
    int idxA = 0, idxB = 0, idxC = 0;
    int cntA = 0, cntB = 0, cntC = 0;
    for (int i = 0; i < answers.size(); ++i) {
        if (stdA[idxA % 5] == answers[i]) ++cntA;
        if (stdB[idxB % 8] == answers[i]) ++cntB;
        if (stdC[idxC % 10] == answers[i]) ++cntC;
        ++idxA;
        ++idxB;
        ++idxC;
    }
    int maxCnt = max(cntA, max(cntB, cntC));
    if (cntA == maxCnt) answer.push_back(1);
    if (cntB == maxCnt) answer.push_back(2);
    if (cntC == maxCnt) answer.push_back(3);
    return answer;
}

좋은 웹페이지 즐겨찾기