알고리즘 공부

1 minute read

실패율 - 카카오 2019
https://programmers.co.kr/learn/courses/30/lessons/42889
처음에는 pair를 생각하지 못하고 우선순위큐를 하나 더 생성해 넣을까 했었다.
왜 안되는지는 못찾았다..
어딘가 틀렸겠지..
그러고 pair 힌트를 얻고 boolean 함수를 생성해 sort할 수 있다는 것을 배웠다.
또, sort의 마지막 인자 기본생성자는 less 이고 오름차순 43210 이다.
이거때문에 또 한참 헤맸다.
greater가 내림차순 01234 이다.
괜히 복잡하게 생각 말고 라이브러리 쓰자..

#include <algorithm>
#include <queue>
#include <string>
#include <vector>
using namespace std;
// 1차
vector<int> solution(int N, vector<int> stages) {
    vector<int> answer;
    vector<int> result;
    sort(stages.begin(), stages.end(), greater<int>());
    int cntOfComing = stages.size();
    int cntOfFail = 1;
    for (int i = 0; i < stages.size(); i++) {
        if (stages[i] == stages[i + 1]) {
            cntOfFail++;
        } else {
            answer[stages[i]] = cntOfComing / cntOfFail;
            cntOfComing -= cntOfFail;
            cntOfFail = 1;
        }
    }
    priority_queue<int, vector<int>, less<int>> q;
    for (int i = 0; i < answer.size(); i++) {
        q.push(answer[i]);
    }
    while (!q.empty()) {
        for (int i = 0; i < answer.size(); i++) {
            if (q.top() == answer[i]) {
                result.push_back(i);
                q.pop();
            }
        }
    }
    return result;
}
bool compare(const pair<int, double> &a, const pair<int, double> &b){
    if(a.second>b.second) return true;
     else if(a.second == b.second){
        if(a.first < b.first) return true;
        else return false;
    } else return false;
}
vector<int> solution(int N, vector<int> stages) {
    vector<int> answer;
    vector<pair<int, double>> index_failure;

    sort(stages.begin(), stages.end());
    int cntOfComing = stages.size();
    int me = 0;
    for (int i = 1; i <= N; i++) {
        int cntOfFail = 0;
        if (cntOfComing == 0) {
            index_failure.push_back(make_pair(i, 0));
            continue;
        }
        while (i == stages[me]) {
            cntOfFail++;
            me++;
        }
        index_failure.push_back(make_pair(i, (double) cntOfFail/cntOfComing));
        cntOfComing -= cntOfFail;
    }
    sort(index_failure.begin(), index_failure.end(), compare);

    for(int i=0;i<N;i++){
        answer.push_back(index_failure[i].first);
    }
    return answer;
}

소요시간 ; 2시간