크게 어려운 부분은 없고, 분모가 0이 되는 경우만 잘 생각해서 예외처리 해주면 되는 것 같다.
cur_user는 해당 스테이지에 머무르고 있는 유저의 수를 담고 있는 배열이고, stage_user는 해당 스테이지까지 시도한 유저의 수를 담고 있다.
이는 stage_user[i] = stage_user[i-1] - cur_user[i-1]
의 수식을 이용해서 구할 수 있다.
위 정보만 유지하고 있으면 실패율을 바로 구할 수 있고, 이를 문제의 조건에 맞춰서 정렬한 뒤 결과 값을 담아서 리턴하면 된다.
코드는 아래와 같다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
const bool compare(const pair<int, double> &a, const pair<int, double> &b)
{
if(a.second == b.second)
return a.first < b.first;
return a.second > b.second;
}
vector<int> solution(int N, vector<int> stages) {
vector<int> answer;
vector<int> cur_user(N + 2, 0);
vector<int> stage_user(N + 2, 0);
for(int i=0;i<stages.size();i++)
cur_user[stages[i]]++;
stage_user[1] = stages.size();
for(int i=2;i<N+2;i++)
stage_user[i] = stage_user[i - 1] - cur_user[i - 1];
vector<pair<int, double>> stage_failure(N + 2);
for(int i=1;i<N+1;i++) {
double failure = stage_user[i] != 0 ? (double)cur_user[i] / (double)stage_user[i] : 0.0f;
stage_failure[i] = make_pair(i, failure);
}
sort(stage_failure.begin() + 1, stage_failure.end() - 1, compare);
for(int i=1;i<N+1;i++)
answer.push_back(stage_failure[i].first);
return answer;
}