본문 바로가기

C++/프로그래머스

[프로그래머스] [C++] 모의고사

문제 풀이

 

#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