본문 바로가기

Study/Programmers

프로그래머스 - 실패율(2019 KAKAO BLIND RECRUITMENT)

입출력 예시를 보면 쉽게 이해할 수 있는 문제이다. 이런 구현 문제는 항상 모든 조건을 만족하도록 코드를 짜야한다.

(스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0으로 정의한다 -> 이 부분을 정의하지 않아서 한 번에 통과하지 못했다.)

ex) N = 5, stages = [2, 1, 2, 1, 2]일 경우 3, 4, 5 스테이지로 간 사람이 없기 때문에 스테이지의 실패율이 모두 0이 된다. 

 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <string>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
map<intint> m;
 
bool comp(pair<intdouble> a, pair<intdouble> b)
{
    if (a.second == b.second)
        return a.first < b.first;
    else
        return a.second > b.second;
}
vector<int> solution(int N, vector<int> stages) {
    vector<int> answer;
    vector<pair<intdouble> > v;
    int total = stages.size();
    for(int i=0; i<stages.size(); i++)
        m[stages[i]]++;
    for(int i=1; i<=N; i++)
    {
        if (total == 0)
            v.push_back(make_pair(i, 0));
        else
            v.push_back(make_pair(i, m[i] / (double)total));
        total = total - m[i];
    }
    sort(v.begin(), v.end(), comp);
    for(int i=0; i<v.size(); i++)
        answer.push_back(v[i].first);
    return answer;
}
cs

위의 코드는 N번의 반복문을 돌면서 total의 수에서 각 스테이지에 위치하는 사람을 계속해서 빼주었는데, 만약 위의 예시처럼

[2, 1, 2, 1, 2]의 경우에는 total이 이미 0인 상태이므로 v 배열에 0 / 0을 push_back하게 되어 에러가 발생한다.

 

따라서 만약 total이 이미 0이 된 경우에는 해당 스테이지 index와 실패율을 0으로 고정한 뒤 push_back해주면 쉽게 해결된다.

 

v vector를 다 구성한 뒤 실패율이 높은 순으로 sort해준 뒤 우리가 반환하려는 answer vector에다가 넣어주면 통과한다.