programming language/Algorithm

[프로그래머스 Level1] 실패율

jellylucy 2021. 7. 22. 13:39

문제

입출력

문제 풀이

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 이용하기