-
반응형
https://programmers.co.kr/learn/courses/30/lessons/42889
코딩테스트 연습 - 실패율
실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스
programmers.co.kr
-풀이-
1. 먼저 각 스테이지당 몇명이 도달했지만 클리어 하지 못했는지 구한다.
2. vector<pair<double,int>> v를 선언한다. double=실패율, int=층수
3. 1층~N층까지 층을 돌며, 해당 층의 실패율을 구한다.
만약 해당 층을 클리어하지 못한사람이 없으면 {0,층수}를 푸쉬해주고,
있다면, {클리어하지 못한사람/사람의 수, 층수} 를 push 해준뒤, 다음 층의 실패율을 위해 사람의 수에서 클리어하지 못한사람의 수를 빼준다.
EX) 전체사람수=8, 1층을 클리어하지 못한사람 = 1명 이라면, 1층의 실패율은 1/8 이 될것이다. 다음 층부터는 1층을 클리어하지 못한사람을 고려하지 않아야 하므로, 사람의 수를 8-1=7로 갱신해준다.
4. 그런뒤 v를 정렬한다. 1순위로는 실패율값을 기준으로 내림차순 정렬하고, 2순위로는 층수를 기준으로 오름차순 정렬을 해준다.
5. v에 저장되어있는 층수를 순차적으로 answer에 넣어준다.
-시간복잡도-
스테이지의 개수를 N, stages벡터의 길이를 M이라고 한다면, 1번을 동작시킬때 O(M) , 3번을 동작시킬땐 O(N), 정렬은 O(NlogN), 마지막으로 5번은 O(N)시간이 걸린다. N은 1~500, M=1~200000 이므로, 최종 시간복잡도는 O(M)이 된다.
-코드-
#include <iostream> #include <vector> #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; } } vector<int> solution(int N, vector<int> stages) { vector<int> answer; vector<pair<double,int>> v; int people=stages.size(); int stay[200001]={0}; for(int i:stages){ stay[i]++; } for(int i=1;i<=N;i++){ if(!stay[i]){ v.push_back({0,i}); } else{ v.push_back({(double)stay[i]/people,i}); people-=stay[i]; } } sort(v.begin(),v.end(),compare); for(auto i:v){ answer.push_back(i.second); } return answer; }
반응형'문제풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 소수 만들기 (0) 2021.06.07 [프로그래머스] [1차]다트 게임 (0) 2021.06.04 [프로그래머스] 예산 (0) 2021.05.31 [프로그래머스] 폰켓몬 (0) 2021.05.31 [프로그래머스] 키패드 누르기 (0) 2021.05.29 댓글