https://school.programmers.co.kr/learn/courses/30/lessons/42840#
문제 설명
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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하는 값을 오름차순 정렬해주세요.
입출력 예
answers return
[1,2,3,4,5] | [1] |
[1,3,2,4,2] | [1,2,3] |
이 문제를 보고 어떻게 하면 백터 answer과 각각의 수열을 비교하면 맞은 문제의 개수를 셀까?였다.
쉽게 말해 각각의 수열은 크기가 다르고 백터 answer도 크기를 알 수 없기 때문에 비교를 어떻게 해야 될지가 관건이다. 다음은 내가 생각한 알고리즘이다.
알고리즘
- 먼저 각각의 수열을 담기 위해 백터 3개를 선언해주고 초기화해준다.
- 각가의 수열이 문제를 맞추는 개수를 저장하는 변수를 선언해준다.
- 문제와 각각의 수열을 비교해주어 맞은 문제의 수를 카운트해준다.
- 각 수열 중에서 문제를 가장 많이 맞춘 수열을 찾아낸다.
- 가장 많이 맞춘 수열의 넘버를 우선순위 큐에 넣어준다.(이는 따로 정렬 없이 바로 정렬되게 하기 위함이다.)
- 가장 많이 맞춘 수열과 동일한 수를 맞췄다면 마찬가지로 우선순위 큐에 넣어준다.
- 백터answer1에 큐의 값을 대입해준다.
- 이렇게 해서 최종적으로 answer1을 반환해준다.
코드
#include <bits/stdc++.h>
using namespace std;
vector<int> solution(vector<int> answers) {
priority_queue<int, vector<int>, greater<int>> answer;
vector<int> answer1;
vector<int> one={1, 2, 3, 4, 5};
vector<int> two={2, 1, 2, 3, 2, 4, 2, 5};
vector<int> three={3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
int cnt1=0,cnt2=0,cnt3=0;
for(int i=0;i<answers.size();i++){
if(answers[i]==one[i%one.size()])
cnt1++;
if(answers[i]==two[i%two.size()])
cnt2++;
if(answers[i]==three[i%three.size()])
cnt3++;
}
int maxinum=max({cnt1,cnt2,cnt3});
if(maxinum==cnt1)
answer.push(1);
if(maxinum==cnt2)
answer.push(2);
if(maxinum==cnt3)
answer.push(3);
while (!answer.empty()) {
answer1.push_back(answer.top());
answer.pop();
}
cout<<cnt1<<cnt2<<cnt3;
return answer1;
}
코드를 작성하면서 아래의 코드가 가장 핵심적이고 고민을 많이 했다. 코드를 작성하고 나니 정말 단순한 풀이 법이었다.
if(answers[i]==one[i%one.size()])
cnt1++
if(answers[i]==two[i%two.size()])
cnt2++;
if(answers[i]==three[i%three.size()])
cnt3++;
answers[i]==one[i%one.size()] 이렇게 작성하면 일정 수 만큼 반복하는 수열에 맞게 원소를 비교할 수 있다.
'코딩테스트 연습' 카테고리의 다른 글
프로그래머스 피로도 (0) | 2024.03.20 |
---|---|
프로그래머스 카펫 (0) | 2024.03.19 |
프로그래머스 소수 찾기 (1) | 2024.03.14 |
프로그래머스 최소직사각형 (1) | 2024.03.14 |
프로그래머스 H-Index (0) | 2024.03.13 |