학습(0)/C++ 문제풀이
프로.카카오.실패율
누가 뭐래도 개발자
2025. 2. 26. 15:51
- second값 기준 정렬
vector pair 의 second 값 기준 정렬을 하고 싶은데 [].second 형태를 어찌해야하나 몰랐다.
-> 인자로 pair<int, int>를 넘겨주면 된다!
애초에 각 인덱스에 접근해서 인자를 pair로 넘겨준거니까 pair로 받는 게 맞는 것.
bool compare(const pair<int, float>& a, const pair<int, float>& b)
{
return a.second > b.second;
}
- 1번 케이스와 2번 케이스의 결과값 기준 다름
스테이지를 끝까지 클리어한 사람이 있는 경우와 아닌 경우가 갈리는데,
그 이유는 편의를 위해(sum계산) idx를 stage+1까지로 설정했고, 내림차순 정렬을 하며 값이 밀렸기 때문이다.
-> 0아닌 값 push.
예제는 맞는데 실패.
아마 값이 밀려서 그런듯하다.
cleared[] 하나로 스테이지당 플레이어 수와 스테이지/실패율에 사용했기 때문으로 보인다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
//전체 스테이지 수: N
//도달 스테이지: stages
// 실패율: 해당 스테이지 도달 / 해당 스테이지 이상 도달
//실패율 기준 내림차순 스테이지 출력
//실패율이 같다면 오름차순
//도달 우저가 없는 경우 실패율 0 -> 신경 x
bool compare(const pair<int, float>& a, const pair<int, float>& b)
{
return a.second > b.second;
}
vector<int> solution(int N, vector<int> stages) {
vector<pair<int, float>> cleared(N + 1, { 0,0.f });
//cleared vector
for (int i = 0; i < stages.size(); ++i)
++cleared[stages[i] - 1].second;
for (int i = 0; i < N; ++i)
{
int sum = 0;
for (int j = i; j <= N; ++j)
sum += cleared[j].second;
//first: stage, second: failureRate
cleared[i].first = i + 1;
//failureRate = arr[idx]/sum
cleared[i].second /= sum;
}
sort(cleared.begin(), cleared.end(), compare);
vector<int> answer;
for (int i = 0; i <= N; ++i)
{
if (cleared[i].first)
answer.push_back(cleared[i].first);
}
return answer;
}
- 개선
스테이지당 플레이어수와 스테이지/실패율 컨테이너를 분리했다.
compare에서 동점에 대한 처리를 해주었다.
bool compare(const pair<int, float>& a, const pair<int, float>& b)
{
if (a.second > b.second)
return true;
else
return a.first < b.first;
}
vector<int> solution(int N, vector<int> stages) {
vector<int> stageCount(N + 1, 0);
vector<pair<int, float>> failureRates(N, { 0,0.f });
for (int stage : stages) {
++stageCount[stage - 1];
}
int users = stages.size();
for (int i = 0; i < N; ++i)
{
//first: stage, second: failureRate
failureRates[i].first = i + 1;
failureRates[i].second = (double)stageCount[i] / users;
users -= stageCount[i];
}
sort(failureRates.begin(), failureRates.end(), compare);
vector<int> answer;
for (const auto& failureRate : failureRates) {
answer.push_back(failureRate.first);
}
return answer;
}
뭐가 문제인지 모르겠네.
자바는 혼자 풀었는데.. 이럴 땐 성장못한 느낌이라 의지가 줄어들지만, 그래도 해야한다.
비교함수 수정하면서 first넣음.
float인데 double로 형변환.
통과 코드
bool compare(const pair<int, float>& a, const pair<int, float>& b)
{
if (a.second != b.second)
return a.second > b.second;
else
return a.first < b.first;
}
vector<int> solution(int N, vector<int> stages) {
vector<int> stageCount(N + 1, 0); //idx 예외 방지
vector<pair<int, float>> failureRates(N, { 0,0.f });
//해당 스테이지 클리어한 플레이어 수
for (int stage : stages) {
++stageCount[stage - 1];
}
int clearUsers = stages.size();
for (int i = 0; i < N; ++i)
{
//first: stage, second: failureRate
failureRates[i].first = i + 1;
if (clearUsers > 0)
{
failureRates[i].second = (float)stageCount[i] / clearUsers;
clearUsers -= stageCount[i];
}
}
sort(failureRates.begin(), failureRates.end(), compare);
vector<int> answer;
for (const auto& failureRate : failureRates) {
answer.push_back(failureRate.first);
}
return answer;
}