1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
> 1번 수포자는 1, 2, 3, 4, 5로 반복하여 문제를 찍습니다.
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
> 2번 수포자는 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, ...
> 2번 수포자는 3, 3, 1, 1, 2, 2, 4, 4, 5, 5로 반복하여 문제를 찍습니다.
✔ 이 반복을 배열로 만들어서 문제를 풀어줍니다.
✔ 정답이 담긴 answers은 길이가 10,000이 될 수 있으므로 반복문은 answers의 size만큼 반복해줍니다.
✔ answers의 길이만큼 반복하여 맞은 문제를 찾아갈 때,
1번부터 3번 수포자는 각각 5, 8, 10개의 번호로 반복하여 문제를 찍습니다.
따라서 인덱스가 넘어갈 때 다시 반복될 수 있도록 %로 처리를 해줘야 합니다. ( i % 5, i % 8, i % 10 )
✔ 맞춘 문제를 ++하면서, 가장 큰 정답의 개수를 확인합니다. 그 후 가장 많이 맞춘 사람을 return해줍니다.(오름차순으로)
🌱 정답코드
다른 코드 참고 풀이
* <algorithm> max 함수 활용
maxCount = max(max(count[0], count[1]), count[2]);
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> answers) {
vector<int> answer;
vector<int> student1 = {1, 2, 3, 4, 5};
vector<int> student2 = {2, 1, 2, 3, 2, 4, 2, 5};
vector<int> student3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
vector<int> count(3, 0);
int maxCount = 0;
for(int i = 0; i < answers.size(); i++){
if(answers[i] == student1[i % 5]) count[0]++;
if(answers[i] == student2[i % 8]) count[1]++;
if(answers[i] == student3[i % 10]) count[2]++;
}
maxCount = max(max(count[0], count[1]), count[2]);
for(int i = 0; i < count.size(); i++){
if(maxCount == count[i]){
answer.push_back(i + 1);
}
}
return answer;
}
'OLD_알고리즘 > Programmers - 알고리즘' 카테고리의 다른 글
Programmers ] Level 1 - 완주하지 못한 선수 (0) | 2021.01.22 |
---|---|
Programmers ] Level 1 - 체육복 (0) | 2021.01.19 |
Programmers ] Level 1 - 가운데 글자 가져오기 (0) | 2021.01.10 |
Programmers ] Level 1 - 나누어 떨어지는 숫자 배열 (0) | 2021.01.10 |
Programmers ] Level 1 - 문자열 내 p와 y의 개수 (0) | 2021.01.10 |
댓글