반응형
programmers.co.kr/learn/courses/30/lessons/42889
이번 시간은 카카오 공채 코딩테스트 문제였던 실패율문제에 대해 문제 풀이하려고 합니다.
실패율 문제는 단순 구현 문제이기 때문에 쉽게 접근하실거라고 생각합니다.
간단하게 문제를 요약하자면, 해당 스테이지(단계) 이상을 통과한 사람 중에서, 해당 스테이지(단계)에서 실패한 사람들의 비율을 내림차순으로 정렬(만약 같다면, stage번호가 작은순서대로)을 하는 문제입니다.
크게 어렵지 않게,
8명의 유저가 있다면,
stage 1에서 실패한 사람은 1명, 따라서 stage 1의 실패율을 1/8입니다.
stage1에서 1명이 실패했기 때문에 s
stage2에서는 남은 7명 중에서 stage 2에서 실패한 사람 비율을 또 구하면 됩니다.
계속 쭉쭉 구하다 보면 마지막 스테이지 까지 구할 수 있고 이것을 문제에서 요구한 대로 정렬해서 반환하면 됩니다.
정렬기준 : 각 stage마다 실패율이 높은순으로(만약에 실패율이 같다면, stage번호가 작은순서대로)
구현 방법:
stages 벡터를 입력값으로 받게 되는데,
stages의 크기를 구하고,
크기만큼 for문을 돌리면서 각각의 stage에서 실패한 사람들을 카운트 합니다.
그리고, 각 stage에서 실패율을 구해 다른 벡터에 삽입하고
정렬합니다.
정렬 후 그대로 반환하면 끝!
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
bool compare(pair<double, int> &a, pair<double, int> &b){
if (a.first == b.first) return a.second < b.second;
else return a.first > b.first;
}
int cnt[501];
vector<pair<double, int>> failure;
vector<int> solution(int N, vector<int> stages) {
vector<int> answer;
int stage_size = stages.size();
for (int i = 0; i < stage_size; i++){
cnt[stages[i]]++; // 각각의 stage에서 실패한 사람들 count시켜주기
}
int mo = stage_size; // stage에 참여한 모든 사람 수
for (int i = 1; i <= N; i++){
if (!stage_size || cnt[i] == 0) failure.push_back({0, i}); // stage에서 실패한 사람이 없다면 실패율은 0 (0에서 다른값으로 나누게 되면 가끔 0이 안나올때까 있음..컴퓨터 소수점..)
else{
double t = (double)cnt[i] / mo; // 실패한 사람이 1명 이상이 있다면, 실패율 구하기
failure.push_back({t, i});
}
mo -= cnt[i]; // 해당 단계에서 실패했다는 것은 다음단계도 못했다는 의미이기 때문에 전체 수에서 빼준다.
}
sort(failure.begin(), failure.end(), compare); // 커스터마이징한 compare로 비교연산한다.
int failure_size = failure.size();
for (int i = 0; i < failure_size; i++){
auto p = failure[i];
answer.push_back(p.second); // 값 대입
}
return answer;
}
반응형