문제풀이/프로그래머스

[프로그래머스] 실패율

Hyeon-Uk 2021. 6. 1. 00:43
반응형

https://programmers.co.kr/learn/courses/30/lessons/42889

 

코딩테스트 연습 - 실패율

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스

programmers.co.kr


 

-풀이-

1. 먼저 각 스테이지당 몇명이 도달했지만 클리어 하지 못했는지 구한다.

 

2. vector<pair<double,int>> v를 선언한다. double=실패율, int=층수

 

3. 1층~N층까지 층을 돌며, 해당 층의 실패율을 구한다.

 

만약 해당 층을 클리어하지 못한사람이 없으면 {0,층수}를 푸쉬해주고,

있다면, {클리어하지 못한사람/사람의 수, 층수} 를 push 해준뒤, 다음 층의 실패율을 위해 사람의 수에서 클리어하지 못한사람의 수를 빼준다.

 

EX) 전체사람수=8, 1층을 클리어하지 못한사람 = 1명 이라면, 1층의 실패율은 1/8 이 될것이다. 다음 층부터는 1층을 클리어하지 못한사람을 고려하지 않아야 하므로, 사람의 수를 8-1=7로 갱신해준다.

 

4. 그런뒤 v를 정렬한다. 1순위로는 실패율값을 기준으로 내림차순 정렬하고, 2순위로는 층수를 기준으로 오름차순 정렬을 해준다.

 

5. v에 저장되어있는 층수를 순차적으로 answer에 넣어준다.

 

-시간복잡도-

스테이지의 개수를 N, stages벡터의 길이를 M이라고 한다면, 1번을 동작시킬때 O(M) , 3번을 동작시킬땐 O(N), 정렬은 O(NlogN), 마지막으로 5번은 O(N)시간이 걸린다. N은 1~500, M=1~200000 이므로, 최종 시간복잡도는 O(M)이 된다.

 

-코드-

 

#include <iostream>
#include <vector>
#include<algorithm>
using namespace std;
bool compare(pair<double,int> a, pair<double,int> b){
    if(a.first==b.first){
        return a.second<b.second;
    }
    else{
        return a.first>b.first;
    }
}
vector<int> solution(int N, vector<int> stages) {
    vector<int> answer;
    vector<pair<double,int>> v;
    int people=stages.size();
    int stay[200001]={0};
    for(int i:stages){
        stay[i]++;
    }
    
    for(int i=1;i<=N;i++){
        if(!stay[i]){
            v.push_back({0,i});
        }
        else{
            v.push_back({(double)stay[i]/people,i});
            people-=stay[i];
        }
    }
    sort(v.begin(),v.end(),compare);
    for(auto i:v){
        answer.push_back(i.second);
    }
    return answer;
}
반응형