Over the limit

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

Algorithm/Algorithm 풀이

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

ellapk 2021. 5. 8. 01:19

문제 설명

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

입출력 예

answersreturn

[1,2,3,4,5] [1]
[1,3,2,4,2] [1,2,3]

 

 

문제에서 얻은 교훈이 있다.... 문제의 모든 글자를 꼼꼼히 살필 것.

하나하나 요소들을 살펴보고 어떤 부분이 출제자가 의도한 부분인지 파악해야 한다.

여기서는 1번 수포자가 찍는 방식, 2번 수포자가 찍는 방식 모두 반복되는 걸 볼 수 있는데

이 당연한 걸 제대로 안읽으니 푸는데 앞 부분에서 헤맸다.

 

 

 

answers답을 주고 찍는다고 하니

완전 탐색을 사용하니 반복문을 돌리면 될 것 같다고 일차적으로 생각을 했다.

answers랑 반복되는 num1, num2, num3이랑 비교를 하면 되겠네

 

 

배열에서 반복이라는 것은 만약 arr배열에서 5개씩 반복할 때

arr[1]과 arr[6]이 같다는 것이다. 6%5=1로 나타낼 수 있기 때문에

나눈 값인 인덱스를 잘 활용해야함.

 

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> solution(vector<int> answers) {
    vector<int> answer;
    int num1[5]={1,2,3,4,5};
    int num2[8]={2,1,2,3,2,4,2,5};
    int num3[10]={3,3,1,1,2,2,4,4,5,5};
    
    int count1=0;
    int count2=0;
    int count3=0;

    for(int i=0;i<answers.size();i++){
        if(answers[i]==num1[i%5])count1++;
        if(answers[i]==num2[i%8])count2++;
        if(answers[i]==num3[i%10])count3++;
        
    }
    
    answer = max(count1,count2,count3);
    
    
    return answer;
}

처음 작성한 코든데 안된다..

모범 답안들이랑 비교해보니 다른 점은

 

1. count를 배열로 쓴다는 것과

 

근데 나는 처음부터 count를 배열로 쓰진 않아서

이 문제는 반복문에 집착하지 않고 그냥 세 줄 직접 쓰기로 했다.

count1,2,3을 새 vector를 생성하여 새로 넣는 방법도 보았다

 

2. max는 먼저 2개 비교 후 한번 더 비교하는 것(이건 algorithm라이브러리 안에 있는 함수들에 대한 이해 부족..)

 

3. 마지막에 answer에 push_back으로 넣어주는 것 (참고로 push_back)은 마지막 위치에 넣어주는 것임

 

 

배열에 담아 return 하라는 부분을 vector와 연결하여 push_back으로 처리한 부분은

아예 생각하지 못했었다.

배열 선언 초기화 등등 기본 개념에 대해서도 복습할 수 있었음.

 

 

분발하자...

 

 

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> solution(vector<int> answers) {
   
    int num1[5]={1,2,3,4,5};
    int num2[8]={2,1,2,3,2,4,2,5};
    int num3[10]={3,3,1,1,2,2,4,4,5,5};
    
    int count1=0;
    int count2=0;
    int count3=0;

    for(int i=0;i<answers.size();i++){
        if(answers[i]==num1[i%5])count1++;
        if(answers[i]==num2[i%8])count2++;
        if(answers[i]==num3[i%10])count3++;
        
    }
    
    
    vector<int> answer;
    
   
    int maxcount = max(max(count1,count2),count3);
    
    if(maxcount==count1)answer.push_back(1);
    if(maxcount==count2)answer.push_back(2);
    if(maxcount==count3)answer.push_back(3);
   
    
    return answer;
}