문제
풀이
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(int N, vector<int> stages) {
vector<int> answer;
vector<int> stay(N,0);
vector<float> fRate;
int person = stages.size();
for(int i=0; i<stages.size(); i++){
if(stages[i] <= N)
stay[stages[i]-1] ++;
}
for(int i=0; i<person; i++){
if(person == 0){
fRate.push_back(0.0);
continue;
}
fRate.push_back((float)stay[i]/person);
person -= stay[i];
}
for(int i=0; i<fRate.size(); i++){
int max_index = max_element(fRate.begin(), fRate.end()) - fRate.begin();
answer.push_back(max_index+1) ;
fRate[max_index] = -1;
}
return answer;
}
해결 과정
1. 클리어하지 못한 사용자 수를 stay벡터에 저장한다.
2. stay벡터와 person(총 유저 수)을 이용해 실패율을 구하고 fRate벡터에 저장한다.
person은 [총 유저 수 - 스테이지 1에 머무른 유저 수 = 스테이지 2에 도전한 유저 수]의 방법으로 구해주었다.
person의 값이 0일 경우 실패율을 구하는 공식에 대입할 대 오류가 발생할 수 있기 때문에 fRate에 직접 0의 값을 넣 어주었다.
3. fRate의 value(실패율)가 가장 높은 인덱스(스테이지) 값을 answer벡터에 넣는다.
다른 사람 풀이
#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;
}
'Algorithm > 카카오기출' 카테고리의 다른 글
[프로그래머스]다트게임 / stringstream (0) | 2022.01.19 |
---|---|
[프로그래머스]비밀지도 (0) | 2022.01.15 |
[프로그래머스]크레인 인형뽑기 게임 (0) | 2022.01.12 |
[프로그래머스] 키패드 누르기 (0) | 2022.01.11 |
[프로그래머스]숫자 문자열과 영단어 (0) | 2022.01.08 |