문제
2019 KAKAO BLIND RECRUITMENT
리뷰
answer에 담아야 하는 건 실패율 높은 순의 '인덱스'이다.
그래서 pair 에 인덱스와 실패율을 담았다. 자료형에 주의하자.
vector<pair<int, double>> per; // <인덱스, 실패율>
// 실패율 = N스테이지에 위치한 사람 수 / N스테이지 이상에 위치한 사람 수
double a = count(stages.begin(), stages.end(), i); // N에 위치한 사람
double b = count_if(stages.begin(), stages.end(), [i](int elem) { return elem >= i; }); // N 이상인 사람
제한 사항을 주의해야 한다.
- 만약 실패율이 같은 스테이지가 있다면 작은 번호의 스테이지가 먼저 오도록 하면 된다.
bool compare(pair<int, double> a, pair<int, double> b) { if (a.second == b.second) return (a.first < b.first); return (a.second > b.second) ; }
- 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은
0
으로 정의한다.
if (b == 0) { // 스테이지에 도달한 사람이 없으면, 실패율 0
per.push_back({i , 0 });
continue;
}
코드
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
// 만약 실패율이 같은 스테이지가 있다면, 작은 번호의 스테이지가 먼저 온다
bool compare(pair<int, double> a, 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<pair<int, double>> per; // <인덱스, 실패율>
for (int i = 1; i <= N; i++) { // 스테이지 : 1부터 N까지
double a = count(stages.begin(), stages.end(), i); // i에 위치한 사람
double b = count_if(stages.begin(), stages.end(), [i](int elem) { return elem >= i; }); // i 이상인 사람
if (b == 0) { // 스테이지에 도달한 사람이 없으면, 실패율 0
per.push_back({i , 0 });
continue;
}
double fail = a / b;
per.push_back({i, fail});
}
sort(per.begin(), per.end(), compare);
for (int i = 0; i < N; i++) { // 인덱스를 answer에 옮긴다
answer.push_back(per[i].first);
}
return answer;
}
728x90
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 구명보트 c++ (0) | 2021.01.31 |
---|---|
[프로그래머스] 징검다리 건너기 c++ (0) | 2021.01.31 |
[프로그래머스] 체육복 c++ (0) | 2021.01.31 |
[프로그래머스] 최대공약수와 최소공배수 c++ (0) | 2021.01.19 |
Hacker Rank - Angry Professor (0) | 2021.01.19 |