본문 바로가기
IT/알고리즘

★55] 프로그래머스 실패율

by 깻잎쌈 2020. 10. 25.
반응형

programmers.co.kr/learn/courses/30/lessons/42889#

 

코딩테스트 연습 - 실패율

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

programmers.co.kr

 

1. 스테이지 별 실패율값을 구하고 

2. 실패율 기준으로 정렬하여 

3. 그 순서대로 스테이지 번호를 반환한다.

 

1.

#include <string>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;

bool cmp(const pair<int, double>& a, const 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<double>fail; // 각 stage별 실패율 
    sort(stages.begin(), stages.end());

    int stageCnt = 1;
    int start = 0;
    bool f = false;

    // 스테이지 별로 계산 
    for (int i = 1; i <= N; i++) { 
        f = false;
        for (int j = 0; j < stages.size(); j++) {
            if (stages[j] > i) {
                fail.push_back(0);
                break;
            }
            else if (stages[j] == i) {
                start = j;
                for (int k = j; k < stages.size(); k++) {
                    if (stages[k] > i) {
                        fail.push_back((double)(k - start) / (double)(stages.size() - start));
                        f = true;
                        break;

                    }
                    else if (k == stages.size() - 1) {
                        fail.push_back((double)(k + 1 - start) / (double)(stages.size() - start));
                        f = true;
                        break;
                    }

                }

            }
            if (f)
                break;
        }

    }
    if (fail.size() < N)
        while (fail.size() != N)
            fail.push_back(0);

    //map에 값 넣어주고 
    map<int, double> s;
    for (int i = 0; i < fail.size(); i++)
        s.insert({ i + 1, fail[i] });

    //value값으로 정렬
    vector<pair<int, double>> vec(s.begin(), s.end());
    sort(vec.rbegin(), vec.rend(), cmp);

    // ans vector에 삽입 
    for (int i = 0; i < vec.size(); i++)
        answer.push_back(vec[i].first);

    return answer;
}

 

 

2.

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

bool cmp(const pair<int, double>& a, const 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>>fail; // 각 stage별 실패율 
    sort(stages.begin(), stages.end());

    int stageCnt = 1;
    int start = 0;
    bool f = false;

    // 스테이지 별로 계산 
    for (int i = 1; i <= N; i++) { 
        f = false;
        for (int j = 0; j < stages.size(); j++) {
            if (stages[j] > i) {
                fail.push_back({i, 0});
                break;
            }
            else if (stages[j] == i) {
                start = j;
                for (int k = j; k < stages.size(); k++) {
                    if (stages[k] > i) {
                        fail.push_back( {i, (double)(k - start) / (double)(stages.size() - start)});
                        f = true;
                        break;

                    }
                    else if (k == stages.size() - 1) {
                        fail.push_back( {i,(double)(k + 1 - start) / (double)(stages.size() - start)});
                        f = true;
                        break;
                    }

                }

            }
            if (f)
                break;
        }

    }
    
    // 없는값 0으로 넣어주고 
    if (fail.size() < N)
        while (fail.size() != N)
            fail.push_back({ fail.size()+1, 0});

    //value값으로 정렬
    sort(fail.rbegin(), fail.rend(), cmp);

    // ans vector에 삽입 
    for (int i = 0; i < fail.size(); i++)
        answer.push_back(fail[i].first);

    return answer;
}

 

3.

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

bool cmp(const pair<int, double>& a, const 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>>fail; // 각 stage별 실패율 
    sort(stages.begin(), stages.end());

    int stageCnt = 1;
    int start = 0;
    bool f = false;
    int user = stages.size();

    // 스테이지 별로 계산 
    for(int i = 1; i <= N; i++) {
        double count = 0;
        
        for(int j = 0; j < stages.size(); j++)
        {
            if(stages[j] == i)
                count++;
        }
        if(count == 0)
            fail.push_back({i,0});
        else
            fail.push_back({i, count / user});
        user -= count;
    }

    //value값으로 정렬
    sort(fail.rbegin(), fail.rend(), cmp);

    // ans vector에 삽입 
    for (int i = 0; i < fail.size(); i++)
        answer.push_back(fail[i].first);

    return answer;
}
반응형

댓글