본문 바로가기

코딩 테스트/프로그래머스

[프로그래머스 Level 1, C++] 실패율

728x90
반응형

문제 : 실패율


풀이 방법

answer 값으로 실패율을 넣는게 아니라 스테이지 단계를 넣어야 해서 이걸 어떻게 해야할까 하다가

2차원 배열을 만들고 0번째에는 스테이지, 1번째에는 실패율을 넣고 내림차순 조건으로

1번째만 보고 정렬을 한다면 하고 생각이 떠올라서 했는데 되어서 다행이었다.

 

실패율을 만드는 방법은 해당 단계 / 단계를 클리어한 플레이어 수로 만들면 되는데

스테이지를 전부 클리어한 경우도 있기 때문에 이 경우를 참고하고 클리어한 플레이어를 어떻게 구하면 될까 하고 생각을하다가 count_if로 해당 단계보다 큰 숫자를 가진 요소의 갯수를 더하면 쉽게 구할 수 있었다. count_if에서 비교할 변수는 지역변수로 넣으면 이상하게 오류가 나기에 전역변수로 빼줘야했다.

 

하다보니 ignal: floating point exception (core dumped) 이런 오류가 뜨는데

해당 단계를 클리어한 플레이어가 0일 수도 있기 때문에 삼항연산자로 클리어가 0이면 그냥 0을 배열에 추가하는것도 꼭 넣어야했다. 그리고 double 배열에 넣을 때는 static_cast<double> 이런식으로 해주던지 아니면 나처럼 double 변수에 넣어서 넣어야 오류가 나지 않는다.

 

정렬 조건문에서 실패율이 같은 경우도 있기 때문에 해당 경우는 스테이지를 비교해서 오름차순으로 정렬을 해줘야 했다.

 

지금까지 진짜 어려웠던 문제였다.. ㄹㅇ로...


소스 코드

#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int i, n;
bool compare(vector<double>a, vector<double>b) {
    if(a[1] == b[1]) {
        return a[0] < b[0];
    }
    return a[1] > b[1];
}
vector<int> solution(int N, vector<int> stages) {
    n = N;
    vector<int> answer;
    vector<vector<double>> failed;
    for(i=1; i<=N; i++) {
        double count = i;
        double failed_player = count_if(stages.begin(), stages.end(), [](int e){return e==i;});
        double clear_player = count_if(stages.begin(), stages.end(), [](int e){return e>=i;});
        vector<double> temp;
        temp.push_back(count);
        temp.push_back(clear_player != 0 ? failed_player/clear_player : 0);
        failed.push_back(temp);
    }
    sort(failed.begin(), failed.end(), compare);
    for(auto & u: failed) {
        answer.push_back(u[0]);
    }
    return answer;
}

 

728x90
반응형