프로그래머스 42889 - 실패율
문제 링크
생각 및 접근
- struct를 다루는 것이 관건이 된 문제다.
- 문제 해결의 구조
- 우선, 아래
struct Stage
를 N
개 담고 있는 vector를 만든다. (v
)
- 문제에서 주어진
stages
를 순회한다.
- 만약
stages[i] > N
(즉, 이 유저가 고인물이라면)
- 이 유저는 1부터
N
까지의 모든 스테이지를 통과한 것이 된다. 따라서, Stage의 idx 1 ~ N 까지의 성공 유저 수를 하나씩 늘린다.
- 만약
stages[i] <= N
(즉, 이 유저가 뉴비라면)
- 이 유저는 1부터
stages[i] - 1
까지 통과한 것이고, stages[i]
를 실패한 상태
- 따라서 Stage의 idx 1 ~
stages[i] - 1
까지의 성공 유저 수를 하나씩 늘리고,
- Stage의 idx
stages[i]
의 실패 유저 수를 하나씩 늘린다.
- 순회가 끝나면, 실패율을 계산해서 실패율 내림차순 -> 스테이지 단계 오름차순 순으로 정렬한다.
- 정렬이 끝난
v
의 각 Stage
의 단계 번호를 answer
에 담아 반환한다.
struct Stage
코드
#include <bits/stdc++.h>
using namespace std;
struct Stage{
int idx;
int s;
int f;
float rate;
Stage(int i, int a, int b){
idx = i; s = a; f = b; rate = 0;
}
void setS(){
s++;
}
void setF(){
f++;
}
void calcRate(){
if(s + f == 0){
rate = 0;
}
else{
rate = (float) f / (float) (s + f);
}
}
bool operator < (const Stage & b) const {
if(rate == b.rate){
return idx < b.idx;
}
return rate > b.rate;
}
};
vector<int> answer;
vector<Stage> v;
vector<int> solution(int N, vector<int> stages) {
for(int i = 1; i <= N; i++)
v.push_back(Stage(i, 0, 0));
for(int i = 0; i < stages.size(); i++){
if(stages[i] > N){
for(int j = 0; j <= N - 1; j++)
v[j].setS();
}
else {
for(int j = 0; j <= stages[i] - 2; j++)
v[j].setS();
v[stages[i] - 1].setF();
}
}
for(int i = 0; i < N; i++) v[i].calcRate();
sort(v.begin(), v.end());
for(int i = 0; i < N; i++) answer.push_back(v[i].idx);
return answer;
}
채점 결과