문제 정답의 배열이 주어지면 1번 수포자부터 3번 수포자까지 가장 많은 정답을 받은 사람을 answer 배열에 넣으면 된다.

수포자의 반복되는 패턴을 a, b, c 배열에 담아 answers 인덱스와 함께 돌려가면서 카운트를 올려주면 된다.

 

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

using namespace std;

vector<int> solution(vector<int> answers) {
    vector<int> answer;
    vector<int> a = { 1,2,3,4,5 }, b = { 2,1,2,3,2,4,2,5 }, c = { 3,3,1,1,2,2,4,4,5,5 };
    vector<int> C(3);

    int ai = 0, bi = 0, ci = 0;
    for (auto i : answers) {
        if (i == a[ai++]) {
            C[0]++;
            if (ai == 5) ai = 0;
        }
        if (i == b[bi++]) {
            C[1]++;
            if (bi == 8) bi = 0;
        }
        if (i == c[ci++]) {
            C[2]++;
            if (ci == 10) ci = 0;
        }
    }
    int max_v = *max_element(C.begin(), C.end());

    for (int i = 0; i < 3; i++) {
        if (max_v == C[i]) {
            answer.push_back(i + 1);
        }
    }

    return answer;
}

 

처음엔 이렇게 적어줬는데 첫 예제 2개는 잘 맞고 그 이후로 제출하니 틀려서 고민해보니

ai, bi, ci 이런 식으로 하는 건 너무 위험한 접근법이었다.

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

using namespace std;

vector<int> solution(vector<int> answers) {
    vector<int> answer;
    vector<int> a = { 1,2,3,4,5 }, b = { 2,1,2,3,2,4,2,5 }, c = { 3,3,1,1,2,2,4,4,5,5 };
    vector<int> C(3);
    
    for (int i = 0; i < answers.size(); i++) {
        if (answers[i] == a[i % 5]) C[0]++;
        if (answers[i] == b[i % 8]) C[1]++;
        if (answers[i] == c[i % 10]) C[2]++;
    }
    int max_v = *max_element(C.begin(), C.end());
    
    for (int i = 0; i < 3; i++) {
        if (max_v == C[i]) {
            answer.push_back(i + 1);
        }
    }
    
    return answer;
}

 

나머지 연산자를 사용하니 바로 맞았다...

나머지 연산자를 잘 기억해둬야겠다.

 

+ Recent posts