Pokeball - Pokemon

99클럽 TIL

99클럽 코테 스터디 20일차 TIL + 완전탐색(C++)

ansi. 2024. 11. 16. 23:06

문제

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

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

코드

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> solution(vector<int> answers) {
    vector<int> answer;
    int student1[] = {1, 2, 3, 4, 5};
    int student2[] = {2, 1, 2, 3, 2, 4, 2, 5};
    int student3[] = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
    vector<int> count = {0, 0, 0};

    for (int i = 0; i < answers.size(); i++) {
        if (answers[i] == student1[i % 5])
            count[0]++;
        if (answers[i] == student2[i % 8])
            count[1]++;
        if (answers[i] == student3[i % 10])
            count[2]++;
    }

    int max = *max_element(count.begin(), count.end());

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

    return answer;
}

 

풀이

우선 각 학생별로 찍는 방법의 패턴부터 파악해야 한다.

1번 학생은 1, 2, 3, 4, 5

2번 학생은 2, 1, 2, 3, 2, 4, 2, 5

3번 학생은 3, 3, 1, 1, 2, 2, 4, 4, 5, 5

과 같은 찍기 패턴을 가진다

이후 주어진 answers를 순회하면서 각 번호별로 몇 개를 맞춰야 하는지 세야 하는데,

찍기 패턴은 반복되기 때문에 answers 배열의 각 정답을 각 학생의 답안 패턴과 비교할 때, % 연산을 사용한다.

정답이 일치할 경우 해당 학생에 대해 점수를 count에 증가시킨다.

이후 최대 점수를 찾기 위해 max_element 함수를 사용해 count 벡터의 최댓값을 max에 저장한다.

마지막으로, count의 값이 max와 동일한 학생의 번호를 answer에 추가하고 answer를 반환해 종료한다.

 

🔎max_element

max_element는 벡터에서 최대값의 주소를 반환한다. 따라서 값을 얻을 때는 *로 값을 얻는다.

 

회고

  • 패턴이 있는 값과 비교하기 위해 % 연산을 사용하는 것을 떠올리는 것이 가장 어려웠다.
  • max_element는 주소값을 반환하는 것을 기억해두자