Programmers/Level 1

C++ / 프로그래머스 / 실패율

GitHubSeob 2021. 8. 21. 19:37

문제

https://programmers.co.kr/learn/courses/30/lessons/42889

 

코딩테스트 연습 - 실패율

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스

programmers.co.kr

문제풀이

실패율은 스테이지를 클리어 못한 플레이어의 수 / 스테이지에 도달한 플레이어의 수이다.

여기서 i 스테이지를 클리어 못한 플레이어의 수는 stages벡터에서 i의 개수이고,

스테이지에 도달한 플레이어의 수는 i 스테이지를 지나간 플레이어의 수이다.

1번 스테이지의 경우 stages벡터에 1은 1개이고, 1 이상인 수가 8개이므로 실패율이 1/8이다.

 

    for (idx = N; idx > 0; --idx)
        pass[idx] = now_stage[idx] + pass[idx + 1];

따라서 메모이제이션을 이용하여 도달한 플레이어의 수를 구한다.

 

실패율과 해당 스테이지를 저장하는 벡터를 pair로 선언하여 2열만 있는 벡터를 만든다.

스테이지는 1 스테이지부터 있기 때문에 1부터 N까지 반복문을 돌아 실패율을 저장한다.

이때 분모가 0이면 안되므로 0일 때 조건을 걸어준다.

bool compare(pair<double, int> a, pair<double, int> b) {
    return a.first > b.first;
}
    stable_sort(failure_late.begin(), failure_late.end(), compare);

실패율을 내림차순으로 정렬하고, 실패율이 같을 때는 오름차순으로 정렬해야 된다.

위에서 for문을 돌릴 때 오름차순으로 돌렸기 때문에 stable_sort를 이용하여 첫 번째 숫자만 비교하여 실패율은 내림차순으로, 인덱스는 오름차순으로 정렬한다.

그다음 idx만 answer에 push 하여 출력한다.

 

 

코드

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

bool compare(pair<double, int> a, pair<double, int> b) {
    return a.first > b.first;
}

vector<int> solution(int N, vector<int> stages) {
    vector<int> answer;
    vector<int> now_stage(N + 2, 0);
    vector<int>pass(N + 2, 0);

    int idx = 0;
    for (idx = 0; idx < stages.size(); ++idx)
        now_stage[stages[idx]]++;

    pass[N + 1] = now_stage[N + 1];

    for (idx = N; idx > 0; --idx)
        pass[idx] = now_stage[idx] + pass[idx + 1];

    vector<pair<double, int>> failure_late;

    for (idx = 1; idx <= N; ++idx) {
        if (pass[idx] != 0)
            failure_late.push_back({ (double)now_stage[idx] / pass[idx], idx });
        else
            failure_late.push_back({ 0, idx });
    }

    stable_sort(failure_late.begin(), failure_late.end(), compare);

    for (idx = 0; idx < N; ++idx)
        answer.push_back(failure_late[idx].second);

    return answer;
}