문제

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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, …

1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항

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

어떻게 접근할 것인가?

  • 음 일단 힌트가 Brute Force라 그냥 내가 생각나는 대로 막 짜봤다ㅎㅎ
  • 일단 수포자의 찍는 루틴을 찾고 그거랑 정답을 for문 내에서 비교했다.
  • 그리고 맞춘 갯수로 맥스를 찾고 맥스랑 같은 값을 가지는 친구를 answer vector에 다 넣어줬다.

BF 활용 코드(복잡도 : O(N))

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<int> answers) {
    vector<int> answer;
    int a[5] = {1, 2, 3, 4, 5};
    int b[8] = {2, 1, 2, 3, 2, 4, 2, 5};
    int c[10] = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
    int count[3] = {0,};
    for(int i = 0; i < answers.size(); i++){
        if(answers[i] == a[i%5]) count[0] ++;
        if(answers[i] == b[i%8]) count[1] ++;
        if(answers[i] == c[i%10]) count[2] ++;
    }
    int max = 0;
    for(int i = 0; i < 3; i++){
        if(count[i] >= max) max = count[i];
    }
    for(int i = 0; i < 3; i++){
        if(count[i] == max) answer.push_back(i+1);
    }
    return answer;
}

느낀점

  • 오랜만에 풀었는데 너무 잘풀려서 당황했다.
  • 나름 5분 컷 했다…ㅎㅎㅎㅎ 코드 짜고 디버깅도 안하고 제출했는데 맞춰버렸… 교만하기 쉬운 상황이지만 이건 뽀록샷이기에
  • 밥먹고 나서 한문제 더 풀어봐야지 ㅎㅎ