728x90
실패율
문제 설명
N
개의 stage 에 대한 카운팅 정렬을 하고 stage에 대한 실패율
(스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수)
을 구하는 문제다.
문제 풀이
소스코드 : C++
- 카운팅 정렬을 위한
cnt[501]
배열을 전역변수와 전체 사용자 수size = stage.size()
를 선언한다. stages
에 들어있는 값들을 카운팅 정렬한다. 이때 해당 값이N+1
인 값은 제외하고 정렬한다. (N+1
은 모든 스테이지를 클리언 사용자)- 실패율을 구하기위한
vector<ID> ans
를 선언한다. (ID = pair<int, doblue>
) stage 1
부터stage N
까지 카운팅 정렬한 값을 이용하여 실패율을 구한다.value/size
를 이용하여 해당stage
와 실패율을ans
에 넣어준다.(value =stage i
에 머문 사람)size -=value
를 한다. 다음stage
탐색시size=0
이면 실패율을0
으로 넣어준다.
ans
를 실패율이 큰 순서로 정렬하고 만약 실패율이 같다면stage
값이 낮은 순으로 정렬한다.- 정렬한 값으로
stage
값들을answer
에 넣어준다.
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
int cnt[501];
struct ID{
int idx;
double value;
};
bool comp(ID a, ID b){
if(a.value == b.value)return a.idx < b.idx;
return a.value > b.value;
}
vector<int> solution(int N, vector<int> stages) {
vector<int> answer;
int size = stages.size();
for(int i : stages)
if(i!=N+1)cnt[i]++;
vector<ID> ans;
for(int i=1; i<=N; i++){
int key = i;
int value = cnt[i];
if(size == 0)ans.push_back({key, 0});
else ans.push_back({key,value/(double)size});
size -= value;
}
sort(ans.begin(), ans.end(), comp);
for(auto res : ans)
answer.push_back(res.idx);
return answer;
}
소스코드 : Python
C++ 로직과 비슷하지만 카운팅 정렬 부분을 딕셔너리를 이용하여 문제를 해결했다.
딕셔너리인 tmp
리스트는 stage size 만큼 할당되어있으므로 실패율 계산할 때 size==0
이되면 break
를 걸어준다.
def solution(N, stages):
answer = []
stages.sort()
size = len(stages)
tmp = {i : 0 for i in range(1,N+1)}
for i in stages:
if i != N+1 : tmp[i] +=1
for i in tmp.items():
key = i[0]
value = i[1]
if size==0 : break
tmp[key] = value/size
size-=value
tmp = sorted(tmp, key=lambda k: tmp[k], reverse=True)
answer = tmp
return answer
728x90
300x250