공부/알고리즘

2019 카카오 코딩테스트 실패율 c++ solution

토고미 2021. 9. 10. 20:57
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

array<array<double,4>, 502> L;
// [x][0] : 깬 사람    [x][1] : 도달한 사람
// [x][2] : 실패율     [x][3] : 원래 번호

bool comp(array<double,4> x, array<double, 4> y) {
    // 실패율이 같으면, 스테이지 번호가 작은 게 앞으로
    if(x[2] == y[2]){
        return x[3] < y[3];
    }
    return x[2] > y[2];
}

vector<int> solution(int N, vector<int> stages) {
    vector<int> answer;
    
    // 원래 스테이지 순서 저장
    for(int i=0; i<=N; i++){
        L[i][3] = i;
    }
    // 깬 사람, 도달한 사람 저장
    for(auto s: stages){
        L[s][1]++;
        for(int i=1; i<s; i++){
            L[i][0]++; L[i][1]++;
        }
    }
    
    //실패율 계산
    for(int i=1; i<=N; i++){
        // 아무도 도달하지 못한 스테이지의 경우,
        // 분모가 0인 것을 방지
        if(L[i][1] == 0){
            L[i][2] = 0;
            continue;
        }
        L[i][2] = (L[i][1] - L[i][0]) / L[i][1];
    }

    L[0][2] = -1; // 정렬을 위해 첫 번째 요소는 -1로 설정
    int e_itr = 502-N; // 스테이지 갯수만큼만 정렬하도록
    sort(L.begin(), L.end()-e_itr+1, comp);
    
    for(int i=0; i<N; i++){
        answer.push_back(L[i][3]);
    }
    
    return answer;
}

2차원 배열 정렬하는법을 찾느라 애먹었다.

다 풀고 생각해보니 vector 썼으면 편한건데 어려운 길로 돌아왔다.

 

코드 설명은 주석으로 다 해놨다.

주의할 점은 아무도 스테이지에 도달하지 못한 경우,

분모가 0인 나누기 예외 처리를 해주어야한다.