본문 바로가기
프로그래밍/프로그래머스

C++ 모의고사(프로그래머스)

by devsu 2020. 5. 27.

프로그래머스_모의고사

https://programmers.co.kr/

 

완전탐색

문제 해석

 

이 문제를 풀기위해 이해해야 할 내용은 다음과 같습니다.

 

목표

문제를 제일 많이 맞춘 사람을 배열에 담기

방법

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

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

 

결과

문제를 제일 많이 맞춘 사람을 배열에 담기

 

1. 내가 제출한 코드

vector<int> solution(vector<int> answers) {
    vector<int> answer;
    vector<int> n1 = { 1, 2, 3, 4, 5 };
    vector<int> n2 = { 2, 1, 2, 3, 2, 4, 2, 5 };
    vector<int> n3 = { 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 };

    vector<int>::iterator iter1 = n1.begin();
    vector<int>::iterator iter2 = n2.begin();
    vector<int>::iterator iter3 = n3.begin();

    int nRet1 = 0;
    int nRet2 = 0;
    int nRet3 = 0;

    for (vector<int>::iterator iter = answers.begin(); iter != answers.end(); iter++)
    {
        if (*iter1 == *iter)    nRet1++;
        if (*iter2 == *iter)    nRet2++;
        if (*iter3 == *iter)    nRet3++;
            
        iter1++;
        if (iter1 == n1.end())
            iter1 = n1.begin();
        
        iter2++;
        if (iter2 == n2.end())
            iter2 = n2.begin();
        
        iter3++;
        if (iter3 == n3.end())
            iter3 = n3.begin();
    }

    vector<int> arrRets;
    arrRets.push_back(nRet1);
    arrRets.push_back(nRet2);
    arrRets.push_back(nRet3);

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

 

내가 봐도 더럽다..

수포자의 크기가 각자 다르기 때문에 iterator로 각각 처리하여 answers와 inter 싱크를 맞추려고 짠 코드

맞춘 개수가 같으면 오름차순으로 answer 벡터에 넣기 위해 3개의 int형 변수(nRet1, nRet2, nRet3), arrRets(vecrot)와 아래 For문 사용

vector를 몇개를 쓴건지..

특히 interator에서 end()가 끝을 가리키는게 아니라 끝의 다음을 가리키는 건지 몰라 테스트 실패로 시간을 보내버렸다.

 

2. 다른사람이 제출한 코드

#include <string>
#include <vector>
using namespace std;

int tester1[5] = {1,2,3,4,5};
int tester2[8] = {2,1,2,3,2,4,2,5};
int tester3[10] = {3,3,1,1,2,2,4,4,5,5};

int max(int a, int b){
    return a < b ? b : a;
}


vector<int> solution(vector<int> answers) {
    vector<int> answer;
    vector<int> score(3);
    int maxScore = 0;
    
    for(int i=0; i < answers.size(); i++){
        if(tester1[i % 5] == answers[i]) score[0]++; 
        if(tester2[i % 8] == answers[i]) score[1]++;     
        if(tester3[i % 10] == answers[i]) score[2]++;
    }

    
    maxScore = max(max(score[0],score[1]),score[2]);
    
    for (int i=0; i<3; i++){
        if(score[i] == maxScore) answer.push_back(i+1);
    }
    
    return answer;
}

깔끔하다

수포자들을 배열로 구현하였고 크기가 다른 배열들은 %연산자를 이용하여 각 배열마다 순서대로 접근할 수 있도록 구현되어있다.

또한 score vector을 선언하여 정답 시 바로 값을 갱신 하였다.

 

내 코드와 다른점

1. iterator로 매 비교시 end()확인 및 begin() 설정 vs 배열과 %연산자를 이용하여 불필요한 비교및 접근 미사용

2. 정답 비교 중간에 저장한 값들을 나중에 다시 또 자료구조에 넣는 불필요한 작업 vs 수포자들의 정답수를 바로바로 갱신

 

분발하자