본문 바로가기

알고리즘/프로그래머스

모의고사

반응형




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
#include <string>
#include <vector>
 
using namespace std;
 
int sA[] = {1,2,3,4,5};
int sB[] = {2,1,2,3,2,4,2,5};
int sC[] = {3,3,1,1,2,2,4,4,5,5};
 
vector<int> solution(vector<int> answers) {
    vector<int> answer;
    int nAnswers[3= {0,};
    
    for(int i = 0; i < answers.size(); i++) {
        if(sA[i % 5== answers[i]) nAnswers[0]++;
        if(sB[i % 8== answers[i]) nAnswers[1]++;
        if(sC[i % 10== answers[i]) nAnswers[2]++;
    }
    
    int max = nAnswers[0];
    for(int i = 1; i < 3; i++) {
        if(nAnswers[i] > max) max = nAnswers[i];
    }
    
    vector<int> maxIndexes;
    
    for(int i = 0; i < 3; i++) {
        if(max == nAnswers[i]) maxIndexes.push_back(i);
    }
    
    for(int i = 0; i < maxIndexes.size(); i++
        answer.push_back(maxIndexes[i] + 1);
    
    return answer;
}
cs


이 문제를 해결하기 위해서는 먼저 수포자들이 찍는 방법이 어떤 식으로 반복이 되는 가를 알 필요가 있다.

1번 수포자의 경우 1,2,3,4,5 이것을 계속해서 반복하고 있고 2번 수포자는 2,1,2,3,2,4,2,5를 반복한다. 마지막으로 3번 수포자는 3,3,1,1,2,2,4,4,5,5를 반복한다. 그래서 이것을 먼저 전역변수로 선언을 해주었다. 1번 수포자는 sA, 2번 수포자는 sB 그리고 3번 수포자는 sC이다. 이렇게만 해주면 나중에 반복해서 비교를 해야하는 경우에 각각 배열의 갯수로 나눠준 나머지 값을 이용하면 이 배열의 뒤에 반복되는 것들을 따로 입력하지 않아도 비교할 수 있다.

비교하는 부분에 해당하는 것이 처음 for문이다. 여기서 비교하기 전에 nAnswers라는 배열을 하나 선언해주었는데 이것은 1,2,3번 수포자들이 얼마나 맞췄는지를 저장하기 위해 선언해준 배열이다. for문 안에서는 정답과 수포자들이 찍은 답들을 비교해서 맞으면 하나씩 증가하는 식으로 반복문이 실행되고 있다.

이 반복문을 빠져나와서 max를 선언해주는데 이 변수가 하는 일은 가장 많이 맞춘 사람의 답 개수를 저정하는 역할을 한다. 이렇게 한 이유는 문제에서 가장 많이 맞춘 사람을 답으로 원하기 때문이다.


max값을 찾아준 이후에 하는 일은 수포자들이 맞힌 개수가 저장된 배열을 검색하면서 max값이랑 일치하는 수포자가 있는지를 찾아주는 구문이다. 여기서 일치하는 사람이 있으면 maxIndexes에 push해준 후 마지막으로 answer에 이 값에 + 1한 값을 넣어주면 된다.

'알고리즘 > 프로그래머스' 카테고리의 다른 글

프린터  (0) 2018.10.24
H-Index  (0) 2018.10.24
쇠막대기  (0) 2018.10.22
기능개발  (0) 2018.10.20
완주하지 못한 선수  (0) 2018.10.13