해설
사용자들의 단계(stages)를 정렬하면 이분탐색(upper_bound, lower_bound)를 통해 해당 단계에 진입한 전체 사용자 수와 실패한 사용자 수를 쉽게 구할 수 있다.
단계별 실패율을 구해 배열에 저장하고, 이를 정렬한 뒤 결과를 출력한다.
전체코드
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <tuple>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <climits>
#include <set>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
using ii = pair<int, int>;
using di = pair<double, int>;
using iii = tuple<int, int, int>;
#define X first
#define Y second
bool cmp(di a, di b) {
// 실패율이 높은 순으로, 단계는 낮은 순으로 정렬
if (a.X != b.X) return a.X > b.X;
return a.Y < b.Y;
}
vector<int> solution(int N, vector<int> stages) {
vector<di> v;
sort(stages.begin(), stages.end());
//단계별 실패율 구하기
for (int i=1; i<=N; i++) {
auto up = upper_bound(stages.begin(), stages.end(), i);
auto lo = lower_bound(stages.begin(), stages.end(), i);
//해당 단계에 진입한 사용자들의 수
double tot = stages.end()-lo;
//해당 단계에 진입했으나 아직 통과하지 못한 사용자들의 수
double nfail = up-lo;
//{살패율, 단계} 저장
if (tot == 0) v.push_back({0, i});
else v.push_back({nfail/tot, i});
}
//단계별 실패율을 내림차순으로 정렬
sort(v.begin(), v.end(), cmp);
vector<int> ret;
for (auto [p, x] : v) ret.push_back(x);
return ret;
}
'대딩 > 프로그래머스풀이' 카테고리의 다른 글
[프로그래머스 lv2] 거리두기 확인하기 풀이 (0) | 2022.03.17 |
---|---|
[프로그래머스 lv2] 뉴스 클러스터링 풀이 (0) | 2022.03.17 |
[프로그래머스 lv2] 메뉴 리뉴얼 풀이 (0) | 2022.03.16 |
[프로그래머스 lv2] 괄호변환 풀이 (0) | 2022.03.16 |
[프로그래머스 lv2] 단체사진찍기 풀이 (0) | 2022.03.15 |
댓글