[프로그래머스/C++]Lv.1 - 실패율

YH J·2023년 5월 29일
0

프로그래머스

목록 보기
101/168

문제 링크

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

내 풀이

map을 이용해서 stages를 for문 돌리면서 스테이지마다 도달했으나 클리어 못한 수와 해당 스테이지를 거쳐간 모든 플레이어 수를 담았다.
만든 reach와 clear를 이용해서 index와 실패율을 담은 map을 완성시키고 그걸 기반으로 vector을 이용하여 sort하고 answer에 담아냈다.

내 코드

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

using namespace std;

bool comp(pair<int,float>& a, pair<int,float>& 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;
    
    map<int,int> reach;//도달했으나 클리어 못한것
    map<int,int> clear;//도달한 플레이어
    map<int,float> m;//index와 실패율
    
    for(int s : stages)//reach 와 clear 입력
    {
        reach[s]++;
        for(int i = 1; i <= s; i++)
            clear[i]++;
    }
    for(int i = 1; i <= N; i++)//reach와 clear기반으로 m 작성
    {
        if(reach[i] == 0)
            m[i] = 0;
        else
            m[i] = (float)(reach[i]) / (float)(clear[i]);
    }
    
    vector<pair<int,float>> vec(m.begin(),m.end());
    
    sort(vec.begin(),vec.end(),comp);
    
    for(auto [a,b] : vec)
        answer.push_back(a);

    return answer;
}

다른 사람의 풀이

#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(const pair<double,int>&a, const pair<double,int>&b){
    if(a.first==b.first) return a.second<b.second;
    return a.first>b.first;

}
vector<int> solution(int N, vector<int> stages) {
    vector<int> answer;
    vector<pair<double,int>> fail;
    for(int i=1;i<=N;i++){
        double a=0,b=0;
        for(int j=0;j<stages.size();j++){
            if(stages[j]==i) a+=1;
            if(stages[j]>=i) b+=1;
        }
        if(b!=0)
            fail.push_back(make_pair(a/b,i));
        else if(b==0)
            fail.push_back(make_pair(0,i));
    }
    sort(fail.begin(),fail.end(),cmp);
    auto it=fail.begin();
    for(it=fail.begin();it!=fail.end();it++)
        answer.push_back(it->second);
    return answer;
}

다른 사람의 풀이 해석

map을 굳이 쓸 필요 없이 N을 기준으로 for문을 돌리면서 1, 2 .. N 스테이지 까지 순회하면서 각 스테이지마다 stages를 for문 돌리면서 stage와 같을 경우 ( 해당 스테이지 까지 도달했지만 아직 클리어 못함) 을 체크해서 a에 담고 stage보다 크거나 같을 경우 ( 해당 스테이지 까지 도달한 플레이어 수 ) 를 b에 담는다.
a와 b를 완성시킨 후에 pair 벡터에 실패율과 스테이지를 넣는다.
그 후 sort하는데 cmp함수를 따로 구현한다. 실패율이 같을 경우 스테이지 숫자를 오름차순으로, 다를 경우 실패율이 높은 스테이지부터 내림차순으로 정렬되도록 구현했다.
정렬 된 벡터에서 스테이지값만 answer에 push한다.

profile
게임 개발자 지망생

0개의 댓글