문제 설명
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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 함수를 작성해주세요.
찍는 형식이 반복된다.
1번 수포자는 {1,2,3,4,5};
2번 수포자는 {2,1,2,3,2,4,2,5};
3번 수포자는 {3,3,1,1,2,2,4,4,5,5};
이 숫자의 배열이 반복된다.
따라서 우리가 체크해야할 부분은 배열answers의 원소값이
1번 수포자 배열, 2번수포자 배열, 3번 수포자 배열과 일치하는지만
확인하면 된다.
//첫번째 포기자
int firstGaveUp[5]={1,2,3,4,5};
//두번째 포기자
int secondGaveUp[8]={2,1,2,3,2,4,2,5};
//세번째 포기자
int thirdGaveUp[10]={3,3,1,1,2,2,4,4,5,5};
바로 떠올린 방식은 %연산자를 통한 방식이다.
answers를 반복문을 통해 순회하며 인덱스를 수포자배열의 크기에 맞게 %연산자로 나머지를 구한다.
예를 들어 1번 수포자 답 배열의 크기인 5로 나머지를 구해보자.
if(answers[i]==firstGaveUp[i%5])
이 비교( answers[i]==firstGaveUp[i%5] )가 뜻하는 건 현재 인덱스가 가리키는 값이 firstGaveUp배열에서 몇번째 인덱스를 가리키냐와 동일한 뜻이다.
풀어서 설명하면 answers의 모든 원소 인덱스를 5개씩 잘라서 그룹으로 나눈다.
현재 i가 가리키는 인덱스가 해당 인덱스가 포함된 5개 원소의 그룹에서 몇번째 인지 물어보는 것과 같다.
그렇게 비교해서 맞으면 점수를 +해주고 나중에 값들을 다 비교 후,
제일 점수가 많은 값을 1부터 넣어주면 된다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> answers) {
vector<int> answer;
int firstGaveUp[5]={1,2,3,4,5};
int secondGaveUp[8]={2,1,2,3,2,4,2,5};
int thirdGaveUp[10]={3,3,1,1,2,2,4,4,5,5};
int firstManPoint=0,secondManPoint=0,thirdManPoint=0;
for(int i=0;i<answers.size();i++){
if(answers[i]==firstGaveUp[i%5]) firstManPoint++;
if(answers[i]==secondGaveUp[i%8]) secondManPoint++;
if(answers[i]==thirdGaveUp[i%10]) thirdManPoint++;
}
int maxPoint= max(firstManPoint,max(secondManPoint,thirdManPoint));
if(maxPoint==firstManPoint) answer.push_back(1);
if(maxPoint==secondManPoint) answer.push_back(2);
if(maxPoint==thirdManPoint) answer.push_back(3);
return answer;
}
주의할점은 else if를 사용하면 안된다.
세 조건문 다 따로따로 체크해야하므로 else if를 사용하면
뒤의 조건을 체크안한다.