Array ( )
2번 문제를 요약하면, (현재 스테이지를 도전중인 사람 / 도전중인 사람+통과한 사람) 을 실패율로 정의하고, 실패율이 큰 순서대로 정렬시키면 되는 문제입니다.
만약 스테이지가 동일하다면 스테이지가 작은 순서대로 정렬해주는 예외만 처리해주면 되는 간단한 문제입니다.
실패율을 계산할 때, 분모를 처음에 사람의 수로 시작하여, 각 스테이지에서 머무르고 있는 사람의 수를 빼면 됩니다. 단, 아직 아무도 도달하지 못한 스테이지의 경우 분모가 0이 되면 예외가 발생하므로, 이를 유의하여 코딩해주면 됩니다.
※해당 소스코드는 참고용이며, 최적화 된 공식 솔루션 소스가 아닙니다. 이 소스를 그대로 복사하여 이용, 또는 제출하는 행위에 대한 불이익은 책임지지 않습니다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
class Node {
public:
int no;
double rate;
bool operator < (const Node &n) const {
return rate == n.rate ? no < n.no : rate > n.rate;
}
} node[511];
vector<int> solution(int N, vector<int> stages) {
vector<int> answer;
vector<int> stage(N+2);
for(int user : stages) {
stage[user]++;
}
int cur = stages.size();
for(int i=1; i<=N; i++) {
node[i].no = i;
node[i].rate = stage[i] / (double)cur;
cur -= stage[i];
if(!cur) cur=1;
}
sort(node+1,node+N+1);
for(int i=1; i<=N; i++) {
answer.push_back(node[i].no);
}
return answer;
}