#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인 나누기 예외 처리를 해주어야한다.
'공부 > 알고리즘' 카테고리의 다른 글
프로그래머스 124 나라의 숫자 c++ solution (0) | 2021.10.06 |
---|---|
2020 카카오 코딩테스트 문자열 압축 c++ solution (0) | 2021.09.10 |
2021 카카오 코딩테스트 신규 아이디 추천 c++ solution (0) | 2021.09.09 |
HackerRank Bigger is Greater c++ solution (0) | 2021.09.07 |
프로그래머스 가장 큰 수 c++ solution (0) | 2021.09.05 |