티스토리 뷰

알고리즘

[프로그래머스/c++] 실패율

개발기록 :) 2022. 8. 16. 21:39

성공 코드(내 코드)

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

using namespace std;

vector<int> solution(int N, vector<int> stages) {
    vector<int> answer, visited(N, 0);
    vector<double> failure, tmp;
    for(int i=1; i<=N; i++){
        double a=0, b=0;
        for(int j=0; j<stages.size(); j++){
            if(stages[j]>=i){
                b+=1;
            }
            if(stages[j]==i){
                a+=1;
            }
        }
        if(a==0){
            failure.push_back(0);
            tmp.push_back(0);
        } else{
            failure.push_back(a/b);
            tmp.push_back(a/b);
        }
    }
    sort(failure.begin(), failure.end());
    for(int i=N-1; i>=0; i--){
        for(int j=0; j<N; j++){
            // 실패율이 같은 스테이지가 있다면 작은 번호의 스테이지가 먼저 오도록 하기 위해 j는 0부터 시작
            if(failure[i]==tmp[j] && visited[j]==0){
                answer.push_back(j+1);
                visited[j]=1;
            }
        }
    }
    
    return answer;
}

 


다른 풀이 코드

  • pair를 이용한 비교 함수 cmp 작성
  • auto 사용
#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;
}