C++/programmers 코딩테스트(level 1) C++

[C/C++] programmers Level 1 실패율

CE : 하랑 2023. 10. 24. 23:14

 

 

실패율

 

 

코드

 

#include <string>
#include <vector> // #include<utility> // pair의 헤더파일 
//Pair 클래스는 사용자가 지정한 2개의 타입의 데이터를 저장하는데 사용합니다. 서로 연관된 2개의 데이터를 한 쌍으로 묶어서 다룰 때 사용하면 편리합니다.
#include <unordered_map> // 해시
#include <algorithm> // sort()

using namespace std;

bool compare(pair<double, int> a, pair<double, int> b){
    if(a.first==b.first){ // 실패율이 같은 상황
        return a.second<b.second; // 작은 번호의 스테이지가 먼저오도록 -> 오름차순 정렬 <
    }else{
        return a.first>b.first; // 실패율 기준 내림차순 정렬 >
    }
}
    
vector<int> solution(int N, vector<int> stages) {
    vector<int> answer;
    vector<pair<double, int>> fall; // double : 실패율, int : 해당 스테이지
    unordered_map<int, double> fallmap; // int : 스테이지 단계, double : 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수
    
    for(int i=0;i<stages.size();i++){
        fallmap[stages[i]]++; // 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 카운트
    }
    
    double fallednum=0;
    int stagesmember=stages.size(); // 총 사용자 인원
    
    for(int i=1;i<=N;i++){
        if(fallmap[i]==0){ // 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0 으로 정의한다.
            fall.push_back({0,i});
            continue;
        }
        
        fall.push_back({fallmap[i]/(stagesmember-fallednum),i}); // stagesmember-fallednum : 총 인원에서 이미 전 스테이지에서 실패한 인원은 제외
        fallednum=fallednum+fallmap[i];
    }
    
    sort(fall.begin(), fall.end(), compare);
    
    for(int i=0;i<fall.size();i++){
        answer.push_back(fall[i].second);
    }
    
    return answer;
}