본문 바로가기
코딩테스트 공부/Programmers

[C++] level1 모의고사 42840

by 메정 2021. 8. 31.

📌모의고사

/* 해당 문제 설명은 링크로 대체한다. */

📌풀이

이 문제는 완전탐색 분류에 속해있는 문제이다. 그래서 완전탐색 그 자체로 풀이했고, 풀이한 뒤 보니 보통 이렇게 풀이하는 것 같았다.
문제는 금방 풀어낼 수 있다! 문제에서 1번, 2번 3번 수포자가 찍는 방식을 정해주었기 때문이다.

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, ...

위에서 *로 표시해두었지만 저 순서대로 반복됨을 알 수 있다. 이걸 이용해서 answer에서 몇 번 맞췄는지 찾을 수 있다.

answer의 for문을 돌면서 문자 하나하나마다 각 1번, 2번, 3번의 정답과 비교하였고,
score라는 vector를 생성해서 각 인덱스 별로 1번, 2번, 3번에 대한 맞춘 개수를 더하도록 구하였다.
문제를 다 돌고난 후 제일 많이 맞춘 숫자를 구해준다.

3번의 for문을 돌면서 제일 많이 맞춘 숫자와 1번, 2번, 3번의 맞춘 개수와 같다면 answer에 넣어주도록 하였다.
1번 친구부터 비교하기 때문에 1번 부터 들어가므로 당연히 오름차순 정렬이 되므로 별도의 오름차순 정렬 처리는 하지 않았다.

📌코드

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int one[5] = {1, 2, 3, 4, 5};
int two[8] = {2, 1, 2, 3, 2, 4, 2, 5};
int three[10] = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};

int max(int a, int b)
{
    return a > b ? a : b;
}

vector<int> solution(vector<int> answers)
{
    vector<int> answer;      //정답을 맞춘 사람들
    vector<int> score(3, 0); //각 one,two,three 별로 맞춘 개수 저장

    //문제를 돌면서 맞춘 사람을 카운트
    for (int i = 0; i < answers.size(); i++)
    {
        if (one[i % 5] == answers[i])
            score[0]++;
        if (two[i % 8] == answers[i])
            score[1]++;
        if (three[i % 10] == answers[i])
            score[2]++;
    }

    int max_score = max(max(score[0], score[1]), score[2]);

    //오름차순으로 비교하며 값 넣기
    for (int i = 0; i < 3; i++)
        if (score[i] == max_score)
            answer.push_back(i + 1); //score는 0번이 one, 1번이 two, 2번이 three

    return answer;
}

댓글