문제

문제 해석
1. 입력은 10,000이므로 O(N)으로 풀어도 문제없음.
2. 1번~3번까지의 수포자가 푸는 방식은 고정
3. 맞추는 걸 기록해서 마지막에 비교해서 answer에 집어넣으면 된다.
코드
#include <string>
#include <vector>
using namespace std;
vector<int> solution(vector<int> answers) {
vector<int> answer;
// 1번 수포자
vector<int> Human1st = {1, 2, 3, 4, 5};
vector<int> Human2nd = {2, 1, 2, 3, 2, 4, 2, 5};
vector<int> Human3rd = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
int Count1 = 0, Count2 = 0, Count3 = 0;
size_t QuestionMax = answers.size();
int Human1Size = Human1st.size();
int Human2Size = Human2nd.size();
int Human3Size = Human3rd.size();
int QuestionAnswer = 0;
for(size_t IDX = 0; IDX < QuestionMax; ++IDX)
{
QuestionAnswer = answers[IDX];
if(QuestionAnswer == Human1st[IDX % Human1Size]) ++Count1;
if(QuestionAnswer == Human2nd[IDX % Human2Size]) ++Count2;
if(QuestionAnswer == Human3rd[IDX % Human3Size]) ++Count3;
}
if(Count1 == Count2 && Count2 == Count3)
{
answer.push_back(1);
answer.push_back(2);
answer.push_back(3);
}
else if(Count1 == Count2 && Count1 > Count3)
{
answer.push_back(1);
answer.push_back(2);
}
else if(Count2 == Count3 && Count2 > Count1)
{
answer.push_back(2);
answer.push_back(3);
}
else if(Count1 == Count3 && Count1 > Count2)
{
answer.push_back(1);
answer.push_back(3);
}
else if(Count1 > Count2 && Count1 > Count3)
{
answer.push_back(1);
}
else if(Count2 > Count1 && Count2 > Count3)
{
answer.push_back(2);
}
else if(Count3 > Count2 && Count3 > Count1)
{
answer.push_back(3);
}
return answer;
}
회고
그냥 벡터 하나 더 쓸 걸 그랬다. 그랬으면 마지막에 if문 쇼를 안해도 될 거를...
max_element를 썼어야 했는데
다른 사람의 풀이
1. max_element를 활용하여 가장 많이 맞춘 경우를 구하고 앞에서부터 맞춘 개수를 담아둔 배열을 순회하여 answer에 push_back()
2. 비슷하지만 if문을 >=처리하여 개수를 줄인 풀이