나만의 작은 도서관
문제 42840. 모의고사 본문
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/42840
난이도 : Lv.1
문제 요약 설명
3명의 수포자가 있을 때 각각 본인만의 패턴으로 문제를 찍는다. 3명 중 가장 높은 점수를 얻은 수포자를 반환하는 프로그램을 작성하시오. (각각 수포자는 1, 2, 3번이며, 가장 높은 점수가 여럿인 경우 오름차순으로 정렬한다.)
각 수포자가 찍는 방법
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
입력 제한
- 시험은 최대 10,000 문제로 구성되어있습니다.
- 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
- 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.
입력 예제
// input
[1,2,3,4,5]
// ans
[1]
풀이 방식
- 각 수포자의 찍는 패턴을 배열에 저장하고, 문제의 정답이 들어있는 answer를 순회하며, 각 수포자가 정답을 맞췄을 때 맞춘 횟수를 1 증가시킨다.
- 패턴은 반복적으로 나타내는 규칙성이므로, 나머지 연산(%)를 이용해 배열을 반복적으로 순회한다.
- 각 수포자가 맞춘 점수의 최대 점수를 max_element를 통해 가장 높은 점수를 얻고 가장 높은 점수를 얻은 수포자의 수를 구한다.
정답 코드
더보기
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> answers) {
vector<int> answer;
vector<int> pattern1 = {1, 2, 3, 4, 5};
vector<int> pattern2 = {2, 1, 2, 3, 2, 4, 2, 5};
vector<int> pattern3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
vector<int> score_list(3);
int size_p1 = pattern1.size(), size_p2 = pattern2.size(), size_p3 = pattern3.size();
int idx_p1 = 0, idx_p2 = 0, idx_p3 = 0;
for(int elem : answers){
score_list[0] += (pattern1[idx_p1] == elem);
score_list[1] += (pattern2[idx_p2] == elem);
score_list[2] += (pattern3[idx_p3] == elem);
idx_p1 = (idx_p1 + 1) % size_p1;
idx_p2 = (idx_p2 + 1) % size_p2;
idx_p3 = (idx_p3 + 1) % size_p3;
}
int max_score = *max_element(score_list.begin(), score_list.end());
for(int i = 0; i < 3; i++){
if(max_score == score_list[i]){
answer.push_back(i+1);
}
}
return answer;
}
더 좋은 코드?
더 이상 좋은 코드는 딱히 생각이 나지 않는다.
'프로그래머스 문제풀이 > 코드카타' 카테고리의 다른 글
문제 140108 문자열 나누기 (0) | 2024.06.18 |
---|---|
문제 42862. 체육복 (0) | 2024.06.17 |
문제 131128. 숫자 짝꿍 (0) | 2024.06.16 |
문제 133499. 옹알이 (2) (1) | 2024.06.15 |
문제 77484. 로또의 최고 순위와 최저 순위 (1) | 2024.06.14 |