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

2021. 2. 24. 15:46필요/코딩테스트(프로그래머스)

문제

programmers.co.kr/learn/courses/30/lessons/42840

 

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

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

programmers.co.kr

 

풀이

#include <vector>

using namespace std;

vector<int> solution(vector<int> answers) {
    vector<int> answer;
    int cnta=0, cntb=0, cntc=0;
    int a[] = {1, 2, 3, 4, 5};
    int b[] = {2, 1, 2, 3, 2, 4, 2, 5};
    int c[] = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
    
    for (int i=0; i<answers.size(); i++) {	// 각 수포자들과 답안 비교
        if (answers[i] == a[i%5]) {
            cnta++;
        }
       if (answers[i] == b[i%8]) {
            cntb++;
        }
        if (answers[i] == c[i%10]) {
            cntc++;
        }
    }
    
    if (cnta >= cntb && cnta >= cntc) {
            answer.push_back(1);
    }
    if (cntb >= cnta && cntb >= cntc) {
            answer.push_back(2);
    }
    if (cntc >= cnta && cntc >= cntb) {
            answer.push_back(3);
    }
    return answer;
}

개념

값의 참조(비교)를 위해 배열에 특정한 값이 계속 반복되어야 한다.

무한히 반복될 수는 없다.

 

%(나머지) 연산자를 이용하면, 특정 배열 내부에서 반복하여 계속 참조할 수 있다.

 


풀이

문제는 두가지 부분으로 나눌 수 있겠다.

 

① 정답과 각 수포자들의 답 비교

② 각 수포자들의 점수 비교해서 정렬

 

for문을 통해 answer 배열의 인자마다, 수포자들의 배열과 비교한다.

답이 같으면 각 cnt 변수를 ++ 한다.

 

정렬해야할 숫자는 최대 3개이다.

따라서 sort 등을 사용하는게 아니라, C 언어가 절차지향 언어임을 활용한다.

코드의 순서에 따라 실행에 반영이 되므로, 1번 수포자 > 2번 수포자 > 3번 수포자 순으로 가장 높은 점수임을 확인하는 if문을 나열하면 된다.

 


+a

직관적으로 코드를 짰는데, 조금은 무식하게도 느껴진다.

 

다른 사람들이 풀은 방법을 보면, ①과정은 다 유사하다.

② 과정에 있어, for문을 사용하는 경우가 은근 많았다. 순서의 문제는 index 인자로 해결한 경우이다.

 

수포자들이 좀 더 많다면, for문을 사용하는 것이 유리하다!