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

level 1

Posted by dongjune on November 24, 2020

문제

프로그래머스 모의고사

풀이

정답이 일치하는 개수는 다음과 같이 3개의 배열을 미리 만든후 나머지를 이용해서 쉽게 구할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int n1[5] = {1,2,3,4,5};
int n2[8] = {2,1,2,3,2,4,2,5};
int n3[10] = {3,3,1,1,2,2,4,4,5,5};

int cnt1=0,cnt2=0,cnt3=0;
    
for(int i=0;i<answers.size();i++){
    int cur = answers[i];
    if(n1[i%5]==cur){
        cnt1++;
    }
    if(n2[i%8]==cur){
        cnt2++;
    }
    if(n3[i%10]==cur){
        cnt3++;
    }
}

이제 cnt1,2,3 중에 최대값을 구해야 한다.
처음에는 일일이 경우를 나눠서 구해줬는데, 더 효율적인 방법이 있었다. 바로 algorithm 헤더의 max_element 함수를 사용하는 것이다.
max_element는 주소 값을 반환하므로 *을 사용하여 값에 접근하는 것을 잊지말자.

1
int max_score = *max_element(v.begin(),v.end());

소스 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> solution(vector<int> answers) {
    vector<int> answer;
    
    int n1[5] = {1,2,3,4,5};
    int n2[8] = {2,1,2,3,2,4,2,5};
    int n3[10] = {3,3,1,1,2,2,4,4,5,5};
    
    int cnt1=0,cnt2=0,cnt3=0;
    
    for(int i=0;i<answers.size();i++){
        int cur = answers[i];
        if(n1[i%5]==cur){
            cnt1++;
        }
        if(n2[i%8]==cur){
            cnt2++;
        }
        if(n3[i%10]==cur){
            cnt3++;
        }
    }
    
    vector<int> v(3);
    v.assign({cnt1,cnt2,cnt3});
    int max_score = *max_element(v.begin(),v.end());
    for(int i=0;i<3;i++){
        if(max_score==v[i]){
            answer.push_back(i+1);
        }
    }
    
    return answer;
}