문제 풀이
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> answers) {
vector<int> answer;
// 수포자의 찍는 방식
vector<vector<int>> s = { {1, 2, 3, 4, 5}
, {2, 1, 2, 3, 2, 4, 2, 5}
, {3, 3, 1, 1, 2, 2, 4, 4, 5, 5} };
// 각 수포자의 점수
vector<int> v = { 0, 0, 0 };
// 수포자의 인원만큼 돌면서
for (int i = 0; i < s.size(); i++) {
// 정답을 확인하는데
for (int j = 0; j < answers.size(); j++) {
// 첫 번째 수포자이고, 이 사람의 찍는 방식은 5를 주기로 계속 돈다.
// 그러므로 j%5를 통해 {0, 1, 2, 3, 4} 를 계속 루프하도록 한다.
// 그리고 이 s[i][j]가 answer[j], 즉 정답과 맞다면 해당 수포자의 점수를 올리도록 한다.
if (i == 0 && s[i][j % 5] == answers[j]) v[0]++;
// 두번째 수포자이며, 찍는 방식은 8을 주기로 돈다. 이하 동일
if (i == 1 && s[i][j % 8] == answers[j]) v[1]++;
// 세 번째 수포자이며, 찍는 방식은 10을 주기로 돈다. 이하 동일
if (i == 2 && s[i][j % 10] == answers[j]) v[2]++;
}
}
// 가장 높은 점수를 받은 사람을 리턴해야 하므로 수포자의 점수 배열중 최댓값을 maxv에 저장
int maxv = *max_element(v.begin(), v.end());
// 수포자 배열을 돌면서
for (int i = 0; i < v.size(); i++) {
// 해당 수포자가 가장 높은 점수를 받은 사람(최댓값을 지닌 사람)이라면
if (v[i] == maxv)
// 해당 수포자 번호를 answer에 삽입. i가 0부터 시작하여 +1을 해준다.
// for문 자체를 for(int i = 1; i <= v.size(); i++)로 만들어 push_back(i)를 해줘도 상관없다.
answer.push_back(i + 1);
}
return answer;
}
사용 알고리즘 간단 소개
1. 배열 내에서의 최댓값, 최솟값 구하기
- #include <algorithm> 헤더 사용
- 최댓값 = *max_element(배열이름.begin(), 배열이름.end());
- 최솟값 = *min_element(배열이름.begin(), 배열이름.end());
문제 링크
programmers.co.kr/learn/courses/30/lessons/42840?language=cpp
코딩테스트 연습 - 모의고사
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는
programmers.co.kr
'C++ > 프로그래머스' 카테고리의 다른 글
[프로그래머스] [C++] 카펫 (0) | 2021.01.02 |
---|---|
[프로그래머스] [C++] 소수 찾기 (0) | 2020.12.26 |
[프로그래머스] [C++] H-Index (0) | 2020.12.09 |
[프로그래머스] [C++] 가장 큰 수 (0) | 2020.12.07 |
[프로그래머스] [C++] K번째 수 (0) | 2020.12.03 |