프로그래머스

2022. 6. 21. 00:18카테고리 없음

수포자 모의고사

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

 

교수님이 나의 생각으로 접근한 방식

더보기
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

    vector<int> solution(vector<int> answers)
    {
    
        size_t size = answers.size();

        int counts[3] = { 0 };

        for (size_t i = 0; i < size; i++)
        {
            int currentAnswer = answers[i];

            if (currentAnswer == 1)
            {
                if (i % 5 == 0)
                {
                    counts[0]++;
                }
                if (i % 8 == 1)
                {
                    counts[1]++;
                }
                if (i % 10 == 2 || i % 10 == 3)
                {
                    counts[2]++;
                }
            }else if (currentAnswer == 2)
            {
                if (i % 5 == 1)
                {
                    counts[0]++;
                }
                if (i % 8 == 0 || i % 8 == 2 || i % 8 == 4 || i % 8 == 6)
                {
                    counts[1]++;
                }
                if (i % 10 == 4 || i % 10 == 5)
                {
                    counts[2]++;
                }
            }
            else if (currentAnswer == 3)
            {
                if (i % 5 == 2)
                {
                    counts[0]++;
                }
                if (i % 8 == 3)
                {
                    counts[1]++;
                }
                if (i % 10 == 0 || i % 10 == 1)
                {
                    counts[2]++;
                }
            }
            else if (currentAnswer == 4)
            {
                if (i % 5 == 3)
                {
                    counts[0]++;
                }
                if (i % 8 == 5)
                {
                    counts[1]++;
                }
                if (i % 10 == 6 || i % 10 == 7)
                {
                    counts[2]++;
                }
            }
            else 
            {
                if (i % 5 == 4)
                {
                    counts[0]++;
                }
                if (i % 8 == 7)
                {
                    counts[1]++;
                }
                if (i % 10 == 8 || i % 10 == 9)
                {
                    counts[2]++;
                }
            }

        }
        int max = 0;
        for (int i = 0; i < 3; i++)
        {
            if (max < counts[i])
            {
                max = counts[i];
            }
        }
        vector<int>answer;

        for (int i = 0; i < 3; i++)
        {
            if (max == counts[i])
            {
                answer.push_back(i+1);
            }
        }
        sort(answer.begin(),answer.end());
        return answer;
    }

코드가 많이길다  뭔가 하드코딩의 느낌이 물씬느껴짐

Look up table 써서 만든거

 

더보기
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

vector<int> solution(vector<int> answers)
{
    // 1. 각 사람마다 몇 문제씩 맞췄는지 확인한다.
    // 모든 문제의 답을 순회하면서 각 사람마다 횟수를 센다.

    int counts[3] = { 0 };

    // 룩업테이블

    static const int solutions[3][10] = {
        { 1, 2, 3, 4 ,5 },
        { 2, 1, 2, 3, 2, 4, 2, 5 },
        { 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 }
    };

    static const int patternSize[3] = { 5, 8, 10 }; //정답 맞추기위해서 만든 인덱스

    size_t size = answers.size();

    for (int i = 0; i < size; ++i)
    {
        int currentAnswer = answers[i];

        if (currentAnswer == solutions[0][i % patternSize[0]])//[0]{1,2,3,4,5} 비교해서 카운트세기
        {
            ++counts[0];
        }

        if (currentAnswer == solutions[1][i % patternSize[1]])//[1]{2,1,2,3,2,4,2,5} 비교해서 카운트세기
        {
            ++counts[1];
        }

        if (currentAnswer == solutions[2][i % patternSize[2]])// [2] { 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 } 비교해서 카운트세기
        {
            ++counts[2];
        }
    }



    // 2. 가장 많이 맞춘 사람을 확인한다.
    // 2-1. 최대값을 저장한다.

    int maxCount = 0;

    for (int i = 0; i < 3; ++i)
    {
        if (maxCount < counts[i])
        {
            maxCount = counts[i];
        }
    }

    // 2-2. 최댓값과 같은지 비교한다.
    vector<int> answer;

    for (int i = 0; i < 3; ++i)
    {
        if (maxCount == counts[i])
        {
            answer.push_back(i + 1);
        }
    }
    // 2-3. 같다면 ? answer에 삽입한다.

    // 3. 여러 명이라면 오름차순으로 정렬한다.
    sort(answer.begin(), answer.end());

    return answer;
}