프로그래머스 42889 - 실패율

문제 링크

생각 및 접근

  • struct를 다루는 것이 관건이 된 문제다.
  • 문제 해결의 구조
    • 우선, 아래 struct StageN개 담고 있는 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
    • int idx : 각 단계의 번호를 의미
    • int s : success한 유저의 수
    • int f : fail한 유저의 수
    • float rate : 실패율
    • void setS() : s를 하나 늘려준다.
    • void setF() : f를 하나 늘려준다.
    • void calcRate() : 실패율을 계산해서 rate에 저장한다. 식은 rate = (float) f / (float) (s + f);인데, s + f가 0일 때 주의하자.
    • 나중에 정렬을 할건데, 제일 우선되는건 실패율 내림차순, 그 다음은 단계의 번호로 오름차순이 되겠다.
        bool operator < (const Stage & b) const {
            if(rate == b.rate){
                return idx < b.idx;
            }
            return rate > b.rate;
        }

코드

#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;
}

채점 결과


+ Recent posts