본 블로그는 비상업적, 비영리적 용도의 학업만을 위해 글을 게시합니다.
#include <string>
#include <vector>
using namespace std;
typedef struct stage{
int num;
double people;
}Stage;
Stage S[502] = {0};
Stage sorted[502] = {0};
void init(int N)
{
for(int i = 1; i <= N; i++)
S[i].num = i;
return;
}
void quickSort(int start, int end)
{
Stage p=S[(start + end)>>1];
int s=start;
int e=end;
while(s<=e)
{
while(S[s].people > p.people && s <= e) s++;
while(S[e].people < p.people && s <= e) e--;
if(s<=e)
{
Stage tmp = S[s];
S[s] = S[e];
S[e] = tmp;
s++; e--;
}
}
if(start<e) quickSort(start,e);
if(s<end) quickSort(s, end);
}
void merge(int p, int q, int r) {
int left = p, mid = q+1, sorted_index = p;
while(left <= q && mid <= r) {
if(S[left].people > S[mid].people) sorted[sorted_index++] = S[left++];
else sorted[sorted_index++] = S[mid++];
}
while(left <= q) sorted[sorted_index++] = S[left++];
while(mid <= r) sorted[sorted_index++] = S[mid++];
for(int i = p; i <= r; i++)
S[i] = sorted[i];
}
void mergeSort(int p, int r) {
if(p<r) {
mergeSort(p , (p + r) >> 1);
mergeSort(((p + r) >> 1) + 1, r);
merge(p, (p + r) >> 1, r);
}
}
vector<int> solution(int N, vector<int> stages) {
vector<int> answer;
int people = 0, denominator = stages.size();
init(N);
if(N == 1)
{
answer.push_back(1);
return answer;
}
for(int i = 0; i < stages.size(); i++)
S[stages[i]].people++;
for(int i = 1; i <= N; i++)
{
if(denominator == 0)
break;
people = S[i].people;
S[i].people /= denominator;
denominator -= people;
}
//quickSort(1, N); //unstable
mergeSort(1, N);
for(int i = 1; i <= N; i++)
answer.push_back(S[i].num);
return answer;
}
#include <string>
#include <vector>
#include <utility>
#include <algorithm>
using namespace std;
bool compare(pair<int, double> a, 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<pair<int, double>> stage;
int people = 0, denominator = stages.size();
stage.push_back({0,0});
for(int i = 1; i <= N + 1; i++)
stage.push_back({i, 0});
for(int i = 0; i < stages.size(); i++)
stage[stages[i]].second++;
for(int i = 1; i <= N; i++)
{
if(denominator == 0)
break;
people = stage[i].second;
stage[i].second /= denominator;
denominator -= people;
}
sort(stage.begin() + 1, stage.end() - 1, compare);
for(int i = 1; i <= N; i++)
answer.push_back(stage[i].first);
return answer;