개발공부/Programmers

[프로그래머스/C++] Level 1_모의고사

예슬예 2022. 1. 28. 20:31

 

<완전탐색 문제>

-더보기에 문제 있어요-

더보기
더보기

<문제 설명>

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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 함수를 작성해주세요.

제한 조건

시험은 최대 10,000 문제로 구성되어있습니다.

문제의 정답은 1, 2, 3, 4, 5중 하나입니다.

가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.

입출력 예

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가
셀 전체 선택
열 너비 조절
행 높이 조절
answers
return
[1,2,3,4,5]
[1]
[1,3,2,4,2]
[1,2,3]
  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

입출력 예 설명

입출력 예 #1

수포자 1은 모든 문제를 맞혔습니다.

수포자 2는 모든 문제를 틀렸습니다.

수포자 3은 모든 문제를 틀렸습니다.

따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다.

입출력 예 #2

모든 사람이 2문제씩을 맞췄습니다.

 

 


<문제 풀이>

#include <string>
#include <vector>
#include <algorithm> //max_element() 함수를 사용하기 위한 헤더파일

using namespace std;

vector<int> solution(vector<int> answers) {
    vector<int> answer;
    vector<int> count(3); //각 학생들이 맞힌 문제 수
    int maxVal=0;
    
    vector<int> first = {1,2,3,4,5};
    vector<int> second = {2,1,2,3,2,4,2,5};
    vector<int> third = {3,3,1,1,2,2,4,4,5,5};
    
    for(int i = 0;i<answers.size();i++){
        if(answers[i] == first[i%first.size()]) count[0] += 1;
        if(answers[i] == second[i%second.size()]) count[1] += 1;
        if(answers[i] == third[i%third.size()]) count[2] += 1;
    }
    maxVal = *max_element(count.begin(), count.end());

    for(int i = 0;i<count.size();i++){
        if(count[i] == maxVal) answer.push_back(i+1); //첫번째 학생부터 최댓값과 같은지 확인하고 answer 배열에 넣는다면 자동으로 오름차순이 성립된다.
    }

    return answer;
}
 

<문제 후기>

그 반복되는 숫자열만 각 학생의 vector로 초기화 후 문제 수가 몇개던 상관없이 답 확인을 위해 modular 연산을 통해 순환시키는 방법을 선택했다. 

 

<algorithm> 헤더파일에 내장되어있는 max_element() 함수... 최댓값을 구하고자 하는 배열 범위의 시작 주솟값과 끝 주솟값만 인자로 주면 되는 간단한 함수다. 

하지만 주의해야 할 것은 값 자체를 리턴하는 게 아니라 해당 값의 주소 혹은 이터레이터를 리턴하기 때문에 꼭 *연산자를 앞에 붙여서 값을 얻어내야한다.

 

모듈러 연산자로 답 확인하는 포인트만 잡으면 쉽게 풀 수 있는 문제였다.