문제
입출력
문제 풀이
1. 실패율 구하기 = 해당 스테이지 통과하지 못한 사람 / 해당스테이지도전자 (해당 스테이지까지 온 사람)
- 주어진 배열 : 스테이지 통과하지 못한 사람들의 스테이지 번호들 (총 배열의 원소개수 = 총 인원)
- 배열을 정렬하기 : 해당 스테이지까지 온 사람과 아닌 사람을 구분할 수 있을 것 같아서.
- stages[index] 가 1~5 (스테이지들)이라면 index++해주면서 index값이 실패율의 분자니까 이용한다.
- usernum은 해당 스테이지도전자인데, 다음 for문 전에 스테이지를 통과못한 인원(index == failcnt)를 빼준다.
- 결과값에 필요한 스테이지 번호와 함께 fail 벡터에 실패율과 스테이지번호 저장한다.
while(stages[index] == i){
failcnt++;//그 값이 실패율의 분자
index++;
}//stage별로 몇 명이 들어와있는지 계산.
double rate = (double)failcnt/usernum;//실패율
fail.push_back(make_pair(rate,i));//스테이지 번호와 함께 저장하기
usernum = usernum - failcnt;//다음 스테이지를 넘어가지 못한 사람들 빼기
2. 출력하기 : 실패율 내림차순대로 나열하되, 실패율이 같다면 스테이지번호 오름차순으로 나열하기
- sort함수 유형 : sort(v.begin(), v.end(), compare) 사용하였다 (compare은 사용자 정의 함수)
bool compare(pair<double, int> a, pair<double, int> b){
if(a.first > b.first){
return true;
}
//실패율 비교해서 내림차순 정렬
else if(a.first == b.first){
if(a.second < b.second){
return true;//if 조건문에 따라 오름차순(작은 번호가 먼저 오도록.
}
else
return false;
}
else
return false;
}
-내림차순은 a>b return true;
-오름차순은 a<b return true;
3. 예외처리 : 실패율 구할 때, 분모가 0인 경우
- i번째 스테이지를 통과하지 못한 인원이 0명이면 rate == 0/0이 된다.
- 이 경우 continue를 이용해 실패율계산 코드를 무시하도록 한다.
if(usernum == 0){//i번째 스테이지에 도달한 유저가 없는경우
fail.push_back(make_pair(0, i));
continue;
}
- for문이나 while문의 {}안에서 continue 문장을 만난 순간 continue문 아래에 있는 실행해야 하는 문장들을 건너 뛰고, 다음 반복을 시작한다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool compare(pair<double, int> a, pair<double, int> b){
if(a.first > b.first){
return true;
}
//실패율 비교해서 내림차순 정렬
else if(a.first == b.first){
if(a.second < b.second){
return true;//if 조건문에 따라 오름차순(작은 번호가 먼저 오도록.
}
else
return false;
}
else
return false;
}
vector<int> solution(int N, vector<int> stages) {
vector<int> answer;
int usernum = stages.size();
int index=0;
vector<pair<double,int>> fail;
sort(stages.begin(), stages.end());//배열을 오름차순으로 정렬한다.
for(int i = 1; i<=N; i++){
if(usernum == 0){//i번째 스테이지에 도달한 유저가 없는경우
fail.push_back(make_pair(0, i));
continue;
}
int failcnt = 0;//i번째 stage를 클리어하지 못한 사용자 수 .
while(stages[index] == i){
failcnt++;//그 값이 실패율의 분자
index++;
}//stage별로 몇 명이 들어와있는지 계산.
double rate = (double)failcnt/usernum;//실패율
fail.push_back(make_pair(rate,i));//스테이지 번호와 함께 저장하기
usernum = usernum - failcnt;//다음 스테이지를 넘어가지 못한 사람들 빼기
}
sort(fail.begin(), fail.end(), compare);
for(int i=0; i<N; i++) {
answer.push_back(fail[i].second);
}
return answer;
}
공부한 점
(1) vector<pair<double, int>> 써보기
(2) sort(a.begin(), a.end(), compare) 에서 compare 만들기 return true, false로 오름내림차순 만들기
(3) continue.. hh
(4) push_back 이용하기
'programming language > Algorithm' 카테고리의 다른 글
[프로그래머스 Level1] K번째 수 (0) | 2021.07.23 |
---|---|
[프로그래머스 Level1] 신규 아이디 추천 (0) | 2021.07.23 |
[프로그래머스 Level1] 다트게임 (0) | 2021.07.22 |
[카카오 신입 공채 1차 코딩 테스트 문제] 비밀지도 (0) | 2021.07.21 |
[프로그래머스 Level2] 프렌즈4블록 (0) | 2021.07.21 |