실패율

NJW·2021년 8월 25일
0

코테

목록 보기
76/170

들어가는 말

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;
}
profile
https://jiwonna52.tistory.com/

0개의 댓글