프로그래머스 - 실패율

well-life-gm·2021년 11월 15일
0

프로그래머스

목록 보기
57/125

프로그래머스 - 실패율

크게 어려운 부분은 없고, 분모가 0이 되는 경우만 잘 생각해서 예외처리 해주면 되는 것 같다.

cur_user는 해당 스테이지에 머무르고 있는 유저의 수를 담고 있는 배열이고, stage_user는 해당 스테이지까지 시도한 유저의 수를 담고 있다.
이는 stage_user[i] = stage_user[i-1] - cur_user[i-1]의 수식을 이용해서 구할 수 있다.
위 정보만 유지하고 있으면 실패율을 바로 구할 수 있고, 이를 문제의 조건에 맞춰서 정렬한 뒤 결과 값을 담아서 리턴하면 된다.

코드는 아래와 같다.

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

const bool compare(const pair<int, double> &a, const 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<int> cur_user(N + 2, 0);
    vector<int> stage_user(N + 2, 0);
    
    for(int i=0;i<stages.size();i++) 
        cur_user[stages[i]]++;
    
    stage_user[1] = stages.size();
    for(int i=2;i<N+2;i++) 
        stage_user[i] = stage_user[i - 1] - cur_user[i - 1];

    vector<pair<int, double>> stage_failure(N + 2);
    for(int i=1;i<N+1;i++) {
        double failure = stage_user[i] != 0 ? (double)cur_user[i] / (double)stage_user[i] : 0.0f;
        stage_failure[i] = make_pair(i, failure);
    }
    
    sort(stage_failure.begin() + 1, stage_failure.end() - 1, compare);
    for(int i=1;i<N+1;i++) 
        answer.push_back(stage_failure[i].first);
    
    return answer;
}

결과

profile
내가 보려고 만든 블로그

0개의 댓글