알고리즘/프로그래머스 1단계

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

게임만드는학생 2024. 7. 25. 12:52

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

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

bool compare(pair<int, float> a, pair<int, float> b)
{
    if (a.second > b.second)
        return true;
    else if (a.second < b.second)
        return false;
    else return a.first < b.first;

}

vector<int> solution(int N, vector<int> stages) {
    vector<int> answer;
    vector<float>arr(N + 1, 0);
    for (int i = 0; i < stages.size(); i++)
    {
        if (stages[i] == N + 1)continue;
        arr[stages[i]]++;
    }
    float n = stages.size();
    for (int i = 1; i < arr.size(); i++)
    {
        int s = arr[i];
        arr[i] /= n;
        n -= s;
    }
    vector<pair<int, float>> m;
    for (int i = 1; i < arr.size(); i++)
    {
        
        m.push_back(make_pair( i, arr[i]));
    }

    sort(m.begin(), m.end(), compare);

    for (auto& v : m)
        answer.push_back(v.first);

    return answer;
}

 

사용자 수 N 과 어느 단계에서 막혔는지를 나타내는 stages 가 주어진다. 

실패율은 스테이지에 도달했지만 클리어못한 수 / 스테이지에 도달한 수 이다. 

단계별로 실패율이 높은 순서대로 answer에 담아서 리턴한다. 

 

먼저 N+1 크기의 arr배열을 만들어서 도달한 스테이지별로 유저 수를 파악한다. 

vector<float>arr(N + 1, 0);
    for (int i = 0; i < stages.size(); i++)
    {
        if (stages[i] == N + 1)continue;
        arr[stages[i]]++;
    }

 

 

그 후,  실패율을 계산하여 저장한다.

float n = stages.size();
    for (int i = 1; i < arr.size(); i++)
    {
        int s = arr[i];
        arr[i] /= n;
        n -= s;
    }

 

그리고 pair를 통해 실패율과 스테이지단계를 묶어서 vector에 저장하고 정렬한다.

vector<pair<int, float>> m;
    for (int i = 1; i < arr.size(); i++)
    {
        
        m.push_back(make_pair( i, arr[i]));
    }

    sort(m.begin(), m.end(), compare);
    
    
bool compare(pair<int, float> a, pair<int, float> b)
{
    if (a.second > b.second)
        return true;
    else if (a.second < b.second)
        return false;
    else return a.first < b.first;

}

 

스테이지 단계만 빼서 answer에 저장한다.

for (auto& v : m)
        answer.push_back(v.first);