2019년 카카오 블라인드 테스트다. 실패율을 계산해서 내림차순으로 정렬하고 실패율이 같으면 오름차순으로 정렬하는 문제. 실패율을 구하는 건 어렵지 않았지만, 정렬할 때 애를 먹었다. 반환을 인덱스로 해줘야만 하기 때문. 이래저래 어렵게 풀었고 다른 사람들의 풀이도 참고했지만, 기본 계산문은 내가 풀었기 때문에 뿌듯했다. 다만, 비교하는 함수에서 어처구니 없는 실수만 안 했더라면 훨씬 빨리 풀었을 것...
이중 반복문을 돌려주는데, 첫 반복문은 스테이지의 갯수만큼 두 번째 반복문은 이용자의 수 만큼 돌려준다. i를 스테이지 1부터 시작해서 이용자와 같으면, 실패했다는 의미니까 실패 변수를 하나 더해준다. 만일 아무도 실패하지 않았다면 0을 넣어준다(0으로 나눠봤자 값이 안 나올 수 있어서). 실패자가 있으면 '실패자/생존자'로 나눠주면 된다. 실패자만큼 생존자를 빼주고 실패자를 0으로 초기화한 뒤 다시 반복문을 돌려준다.
다음 정렬을 해준다. 실패율이 같다면 인덱스의 오름차순으로, 다르다면 실패율의 내림차순으로 정려한다. 여기서 이상한 실수를 했는데, 'a.second == b.second'를 'a.second == b.first'로 써줬다. 어쩐지 내가 보기엔 괜찮은데 자꾸만 틀리더라(...). 마지막으로 정렬한 배열을 인덱스만 정답에 넣어주면 된다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool comp(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>> rate;
double fail;
double survive = stages.size();
for(int i=1; i<=N; i++){
for(int j=0; j<stages.size(); j++){
if(stages[j] == i){
fail++;
}
}
if(fail==0){
rate.push_back(make_pair(i, 0));
}else{
rate.push_back(make_pair(i, fail/survive));
}
survive = survive - fail;
fail = 0;
}
sort(rate.begin(), rate.end(), comp);
for(int i=0; i<rate.size(); i++){
answer.push_back(rate[i].first);
}
return answer;
}