[프로그래머스] 모의고사

monshell·2021년 7월 11일
0

ALGORITHM

목록 보기
1/17

문제 링크

문제 요약

  • 정해진 규칙대로 반복되는 3가지 패턴의 숫자 배열을 주어진 입력 배열과 비교하여 입력 배열과 가장 많이 수가 겹치는 패턴이 어떤건지 찾는 문제

풀이 흐름

  • 입력으로 들어오는 배열의 값을 앞에서부터 하나씩 수포자 1,2,3의 답과 비교한다.

  • 각 수포자들의 정답 패턴은 pick 2차원배열에 저장 해두고, 수포자들의 정답 갯수는 answer 배열에 저장한다. 수포자 1의 정답 패턴은 pick[9], 정답 갯수는 answer[0]에 저장 한다. 수포자 2,3의 정답 패턴과 정답 갯수도 pick과 answer 배열에 저장한다. 입력 배열의 i번째 수를 수포자 pick의 값과 비교하여 값이 같으면 answer 값을 1씩 증가시킨다.

  • 각 수포자의 정답 패턴은 반복되기때문에, 수포자n의 '정답 패턴의 길이+3' 번째 답은 수포자n의 3번째 답(pick[n-1][2])과 동일하다. 수포자n의 정답 패턴의 길이를 length 라고 할 때, 입력 배열의 길이가 length보다 길다면 i번째 문제에 대한 답 = i%length 번째 값을 이용해 찾을 수 있다.

  • 입력 배열의 크기만큼 정답 패턴을 모두 확인했으면 answer 에서 가장 큰 값 max를 찾고, answer 배열에서 ax와 같은 값을 가지는 인덱스를 리턴 배열에 넣어 반환하면 답을 찾을 수 있다.


코드

사용 언어 : C++

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<int> answers) {
    vector<int> answer;
    int pick[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}};
    
    int countOfPIck[3] = {5, 8, 10};
    
    int correct[3] = {0,0,0};
    int max_correct = 0;
    
    for(int i = 0; i < answers.size(); i++)
    {
        int thisAnswer = answers[i];
        for(int k = 0; k < 3 ; k++)
        {
            int pickIndex = (i + countOfPIck[k]) % countOfPIck[k];
            if(thisAnswer == pick[k][pickIndex])
            {
                correct[k]++;
                if(correct[k] > max_correct) 
                    max_correct = correct[k];
            }
        }
    }

    for(int i=0;i<3;i++)
    {
        if(max_correct == correct[i])
            answer.push_back(i+1);
    }
    
    return answer;
}

0개의 댓글