문제
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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 | 구조체와 안정 정렬(stable_sort)을 이용한 풀이
- 수포자들의 정보를 가진 구조체를 생성.
- 채점 후 수포자들의 점수(score) 기준 내림차순으로 정렬하여, 배열의 처음부분에 몰려있는, 즉 최고점을 받은 수포자들만 추출하였다.
#include <vector>
#include <algorithm>
using namespace std;
struct Tester {
int id;
int score;
vector<int> pattern;
};
vector<int> solution(vector<int> answers) {
vector<int> answer;
vector<Tester> testers = {
{1, 0, {1, 2, 3, 4, 5}},
{2, 0, {2, 1, 2, 3, 2, 4, 2, 5}},
{3, 0, {3, 3, 1, 1, 2, 2, 4, 4, 5, 5}}
};
/* 채점 */
for(auto& tester : testers) {
for (int i = 0; i < answers.size(); ++i) {
int j = i % tester.pattern.size();
if (answers[i] == tester.pattern[j])
tester.score++;
}
}
/* 정렬 */
stable_sort(testers.begin(), testers.end(), [](Tester a, Tester b) {
return a.score > b.score;
});
/* 가장 높은 점수를 받은 사람 추출 */
int maxScore = testers[0].score;
for(auto& tester : testers) {
if (tester.score == maxScore) {
answer.push_back(tester.id);
}
else if (tester.score < maxScore) {
break;
}
}
return answer;
}
풀이 #2 | max_element()로 비교
- 이중 for문을 없애기 위해 새로 작성해본 풀이다.
- max_element()를 이용해 최고점을 알아내고, 최고점은 받은 수포자를 추출함.
- 인덱스 + 1이 수포자 번호이다.
- 예: score[0]은 0 + 1 이므로, 수포자1의 점수를 뜻한다.
- 예: score[1]은 1 + 1 이므로, 수포자2의 점수를 뜻한다.
#include <algorithm>
#include <vector>
using namespace std;
vector<int> solution(vector<int> answers) {
vector<int> answer;
vector<int> score(3);
vector<vector<int>> patterns = {{1, 2, 3, 4, 5},
{2, 1, 2, 3, 2, 4, 2, 5},
{3, 3, 1, 1, 2, 2, 4, 4, 5, 5}};
for(int i = 0; i < answers.size(); ++i) {
if(answers[i] == patterns[0][i % patterns[0].size()]) score[0]++;
if(answers[i] == patterns[1][i % patterns[1].size()]) score[1]++;
if(answers[i] == patterns[2][i % patterns[2].size()]) score[2]++;
}
int maxScore = *max_element(score.begin(),score.end());
for(int i = 0; i < patterns.size(); ++i) {
if(score[i] == maxScore)
answer.push_back(i + 1);
}
return answer;
}
'🐸 Problem Solving > Programmers' 카테고리의 다른 글
[Programmers/C++] [PCCP 기출문제] 2번 석유 시추 (0) | 2024.08.22 |
---|---|
[Programmers/C++] 소수 찾기 (0) | 2024.08.19 |
[Programmers/C++] 가장 큰 수 (0) | 2024.08.09 |