Programmers Review

[Lv 1] 모의고사

hanseongbugi 2024. 6. 1. 15:26

https://school.programmers.co.kr/learn/courses/30/lessons/42840

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

이 문제는 완전 탐색을 통해 정답을 가장 많이 맞춘 학생을 찾는 문제이다.

문제 수는 최대 10000개 이기 때문에 단순 반복문으로 문제를 해결할 수 있다.

또한 3명의 학생이 찍는 형식은 정해져있다.

학생 1은 5개의 경우가 반복된다. 또한 학생 2는 8개, 학생 3은 10개의 경우가 반복된다.

따라서 i%M의 연산을 통해 현제 번호에 찍은 형식을 알 수 있다.

 

처음 문제를 해결할 때 가장 정답을 많이 맞춘 학생을 찾을 때 if문을 중첩하여 해결하였다.

#include <string>
#include <vector>

using namespace std;

int op1[] = {1, 2, 3, 4, 5};
int op2[] = {2, 1, 2, 3, 2, 4, 2, 5};
int op3[] = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
int N;
int st1, st2, st3;

vector<int> solution(vector<int> answers) {
    vector<int> answer;
    N = answers.size();
    for(int i = 0;i<N;i++){
        int num = answers[i];
        if(op1[i%5] == num)
            st1 += 1;
        if(op2[i%8] == num)
            st2 += 1;
        if(op3[i%10] == num)
            st3 += 1;
    }
    if(st1 == st2){
        if(st1 == st3){
            answer.push_back(1);
            answer.push_back(2);
            answer.push_back(3);
        }
        else if(st1 < st3){
            answer.push_back(3);
        }
        else{
            answer.push_back(1);
            answer.push_back(2);
        }
    }
    else if(st1 > st2){
        if(st3 > st1)
            answer.push_back(3);
        else if(st1 > st3)
            answer.push_back(1);
        else{
            answer.push_back(1);
            answer.push_back(3);
        }
    }
    else{
        if(st2 > st3){
            answer.push_back(2);
        }
        else if(st3 > st2){
            answer.push_back(3);
        }
        else{
            answer.push_back(2);
            answer.push_back(3);
        }
    }
    
    return answer;
}

 

하지만 위 방식은 N명의 학생이 생길 경우 복잡하게 된다.

따라서 아래 방식과 같이 현재 정답중 가장 큰 수를 찾고, 그 값에 해당하는 학생을 정답 배열에 삽입하여 코드를 고쳤다.

#include <string>
#include <vector>

using namespace std;

int op1[] = {1, 2, 3, 4, 5};
int op2[] = {2, 1, 2, 3, 2, 4, 2, 5};
int op3[] = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
int N;
int st[3];

vector<int> solution(vector<int> answers) {
    vector<int> answer;
    N = answers.size();
    for(int i = 0;i<N;i++){
        int num = answers[i];
        if(op1[i%5] == num)
            st[0] += 1;
        if(op2[i%8] == num)
            st[1] += 1;
        if(op3[i%10] == num)
            st[2] += 1;
    }
    int maxNum = max(max(st[0], st[1]), st[2]);
    
    for(int i = 0;i<3;i++){
        if(maxNum == st[i]) 
            answer.push_back(i+1);
    }
    
    return answer;
}