
문제 정답의 배열이 주어지면 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;
}
나머지 연산자를 사용하니 바로 맞았다...
나머지 연산자를 잘 기억해둬야겠다.
'Programmers' 카테고리의 다른 글
[프로그래머스 C++] 카카오프렌즈 컬러링북 (0) | 2020.09.28 |
---|---|
[프로그래머스 C++] 소수 찾기 (0) | 2020.09.27 |
[프로그래머스 C++] 완주하지 못한 선수 (0) | 2020.09.26 |
[프로그래머스 C++] 두 개 뽑아서 더하기 (0) | 2020.09.26 |
[프로그래머스 C++] 크레인 인형뽑기 게임 (0) | 2020.09.26 |