입력으로 들어오는 배열의 값을 앞에서부터 하나씩 수포자 1,2,3의 답과 비교한다.
각 수포자들의 정답 패턴은 pick 2차원배열에 저장 해두고, 수포자들의 정답 갯수는 answer 배열에 저장한다. 수포자 1의 정답 패턴은 pick[9], 정답 갯수는 answer[0]에 저장 한다. 수포자 2,3의 정답 패턴과 정답 갯수도 pick과 answer 배열에 저장한다. 입력 배열의 i번째 수를 수포자 pick의 값과 비교하여 값이 같으면 answer 값을 1씩 증가시킨다.
각 수포자의 정답 패턴은 반복되기때문에, 수포자n의 '정답 패턴의 길이+3' 번째 답은 수포자n의 3번째 답(pick[n-1][2])과 동일하다. 수포자n의 정답 패턴의 길이를 length 라고 할 때, 입력 배열의 길이가 length보다 길다면 i번째 문제에 대한 답 = i%length 번째 값을 이용해 찾을 수 있다.
입력 배열의 크기만큼 정답 패턴을 모두 확인했으면 answer 에서 가장 큰 값 max를 찾고, answer 배열에서 ax와 같은 값을 가지는 인덱스를 리턴 배열에 넣어 반환하면 답을 찾을 수 있다.
사용 언어 : C++
#include <string>
#include <vector>
using namespace std;
vector<int> solution(vector<int> answers) {
vector<int> answer;
int pick[3][10] = {{1, 2, 3, 4, 5},
{2, 1, 2, 3, 2 ,4 ,2, 5},
{3, 3, 1, 1, 2, 2, 4, 4, 5, 5}};
int countOfPIck[3] = {5, 8, 10};
int correct[3] = {0,0,0};
int max_correct = 0;
for(int i = 0; i < answers.size(); i++)
{
int thisAnswer = answers[i];
for(int k = 0; k < 3 ; k++)
{
int pickIndex = (i + countOfPIck[k]) % countOfPIck[k];
if(thisAnswer == pick[k][pickIndex])
{
correct[k]++;
if(correct[k] > max_correct)
max_correct = correct[k];
}
}
}
for(int i=0;i<3;i++)
{
if(max_correct == correct[i])
answer.push_back(i+1);
}
return answer;
}