문제 풀이 과정을 공유드린다.
문제 출처

1. 문제설명


  • 1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, …
  • 2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, …
  • 3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, …

  • 제한 조건
    • 시험은 최대 10,000 문제로 구성되어있습니다.
    • 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
    • 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.



2. 알고리즘 설계


  • 수포자는 고정 값으로 3명
  • 1, 2, 3 수포자의 규칙 탐색
  • answers.size()만큼 for문을 돌리면서 정답을 맞췄다면 카운팅



3. 로직


  • 수포자 규칙
    • 수포자의 응답이라서 request의 약자인 req로 명명
    int req1[] = {1,2,3,4,5};
    int req2[] = {2,1,2,3,2,4,2,5};
    int req3[] = {3,3,1,1,2,2,4,4,5,5};
    
    • index
      • 모듈라 연산을 이용해서 간단히 탐색할 수 있음.
      • 이게 아니라면 index 변수를 따로 둬야함.

        if(req1[i%5] == answers[i]) ans1++;
        if(req2[i%8] == answers[i]) ans2++;
        if(req3[i%10] == answers[i]) ans3++;
        


  • 전체 코드
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int req1[] = {1,2,3,4,5};
int req2[] = {2,1,2,3,2,4,2,5};
int req3[] = {3,3,1,1,2,2,4,4,5,5};

vector<int> solution(vector<int> answers) {
    int ans1=0, ans2=0, ans3=0;
    
    for(int i=0; i<answers.size(); i++) {
        if(req1[i%5] == answers[i]) ans1++;
        if(req2[i%8] == answers[i]) ans2++;
        if(req3[i%10] == answers[i]) ans3++;
    }
    
    int max_val = max({ans1, ans2, ans3});
    vector<int> ret;
    if(ans1 == max_val) ret.push_back(1);
    if(ans2 == max_val) ret.push_back(2);
    if(ans3 == max_val) ret.push_back(3);
    
    return ret;
}


  • 소감
    • 다른 분들의 코드를 보니, sort()하고, for문을 이용한 코드가 많았다.
    • return할 벡터값이 최대 3개밖에 안되서 if문으로 일일히 넣었다.
      • 이게 속도 측면에서 좀 더 좋다고 생각한다.