반응형

문제 링크

 

코딩테스트 연습 - 모의고사

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는

programmers.co.kr

 

 

풀이1 )

  세 명의 규칙을 찾아서 1번부터 answers.size()까지 각 세명의 답(vc[][])을 채워넣는 배열을 만들고 이후 채점을 한다.

  세 명의 규칙은 다음과 같다.

  1. 1 2 3 4 5 반복
  2. 홀수번째는 2, 짝수번째는 1 3 4 5 반복
  3. 3 1 2 4 5가 각각 2번씩 반복

  세 명의 점수(col) 중 가장 큰 점수(*max_element())를 찾고 가장 큰 점수와 비교하여 같으면 정답 배열에 집어넣는다.

 

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

using namespace std;

vector<int> solution(vector<int> answers) {
    vector<int> answer;
    vector<int> vc[3];
    vector<int> input(3);
    vector<int> col(3);
    int len = answers.size();
    
    for(int i = 0; i < len; ++i){
        input[0] = i%5+1;
        if(i%2)
            input[1] = i/2%4 + (i/2%4 ? 2 : 1);
        else
            input[1] = 2;
        switch(i/2%5){
            case 0:
                input[2] = 3;
                break;
            case 1:
                input[2] = 1;
                break;
            case 2:
                input[2] = 2;
                break;
            case 3:
                input[2] = 4;
                break;
            case 4:
                input[2] = 5;
                break;
        }
        
        for(int j = 0; j < 3; ++j)
            vc[j].push_back(input[j]);
    }
    
    for(int i = 0; i < len; ++i){
        for(int j = 0; j < 3; ++j){
            if(vc[j][i] == answers[i])
                col[j]++;
        }
    }

    int top = *max_element(col.begin(), col.end());
    for(int i = 0; i < 3; ++i)
        if(col[i] == top)
            answer.push_back(i+1);
    return answer;
}

 

풀이2)

  정답코드에서 더 구현에 쉬운 방법을 보고 다시 구현해봤다.

  세 명의 정답을 보면 특정 주기로 답이 반복되므로 반복되는 부분을 배열로 저장한 후 %연산자를 활용한다.

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

using namespace std;


vector<int> solution(vector<int> answers) {
    vector<int> answer;
    vector<int> one = {1, 2, 3, 4, 5};
    vector<int> two = {2, 1, 2, 3, 2, 4, 2, 5};
    vector<int> thr = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};

    vector<int> col(3);
    int len = answers.size();
    for(int i = 0; i < len; ++i) {
        if(answers[i] == one[i%one.size()])
            col[0]++;
        if(answers[i] == two[i%two.size()])
            col[1]++;
        if(answers[i] == thr[i%thr.size()])
            col[2]++;
    }
    
    int top = *max_element(col.begin(), col.end());
    for(int i = 0; i < 3; ++i) 
        if(col[i] == top)
            answer.push_back(i+1);
    return answer;
}

 

반응형

+ Recent posts