👋 프로그래머스 <무지의 먹방 라이브> 풀이 코드 (TIL 240102)
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
// 각 스테이지에 따른 실패율 -> pair(stage number, 실패율)
bool cmp (pair<int, double> a, pair<int, double> 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<int> progress(N+2);
vector<pair<int, double>> fail;
for (int i=0; i<stages.size(); i++) {
progress[stages[i]] += 1;
}
int players_num = progress[N+1];
for (int i=N; i>0; i--) {
players_num += progress[i];
if (players_num == 0) fail.push_back(make_pair(i, double(0)));
else fail.push_back(make_pair(i, double(progress[i]) /double(players_num)));
}
sort(fail.begin(), fail.end(), cmp);
for (int i=0; i<N; i++) {
answer.push_back(fail[i].first);
}
return answer;
}
c++ 에서 나누기"/" 연산을 진행할 때 int/int를 하게 되면 결과값도 int이 되어 몫만 남게된다.
int a = 7;
int b = 3;
cout << a/b;
결과값: 2
따라서 나눗셈의 결과값을 소수로 나타내고 싶다면 type 변환이 필요한데, 피연산자 중 적어도 하나를 double로 변환시켜주면 된다. 아래의 코드는 모두 동일하게 2.33333을 출력한다.
(기본적으로는 정수부분과 소수부분을 합쳐서 총 6자리만 출력하는 것 같다)
cout << double(a) / b;
cout << a / double(b);
cout << double(a) / double(b);
나눗셈을 할 때 분모가 0인 상황 두 가지를 살펴보자.
만약 int형 0으로 나눗셈을 시도한다면 오류가 발생한다. 하지만 double형 0으로 나눗셈을 시도한다면 결과값은 inf로 출력된다. 따라서 이러한 예외처리를 똑바로 해주는 것이 중요하다!