https://programmers.co.kr/learn/courses/30/lessons/42889
스케치도 한 장에 끝나고 비교적 간단한 문제였던 것 같다
근데 나는 좀 헤맸는데 예외처리를 하나 놓쳤기 때문이다
예를 들어 stages = { 1, 1, 1, 1, 1 } 이고, N이 2인 경우
Stage 1의 실패율은 1이고, Stage 2의 실패율은 0이 된다.
내 알고리즘에서 P는 실패율에서 분모를 담당하기 때문에
0이 되면 안되는데, P = P - n1 하는 부분이
위의 예시대로 하면 P가 0이 되어 버린다.
그래서 p가 0인 경우 실패율을 0으로 처리해야 했다
위 스케치에서 <예외>로 적어둔 부분이
거의 자동으로 처리가 된다고 생각했는데,
두 번째 예외를 좀 더 주의깊게 처리하지 못했던 거 같다
애매하게 몇 개만 실패가 떠서 헤매다가
저 부분을 해결하고 나니 문제를 풀 수 있었다
처음에는 헤맬 때 '질문하기'를 좀 봤는데 시간복잡도에 대한 이야기가 있어서 시간초과에 걸린건가 싶었다
count과 같은 함수를 for문에서 같이 돌리면 안된다는 의견이 있어서 for문 바깥으로 빼주었는데
빼든 넣든 정답에는 영향이 없었다
그리고 스케치에서 또 더 달라진 점은
실패율을 내림차순 정렬하려고 했던 부분인데,
내림차순을 하면 정작 해당 실패율이 어떤 stage를 나타내는지 알 수가 없다
그래서 가장 큰 실패율을 찾은 다음 그 인덱스를 answer에 저장하였고,
해당 인덱스는 FLAG로 채워서 다음엔 max value로 선정되지 않게 처리했다
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define FLAG -1
vector<int> solution(int N, vector<int> stages) {
vector<float> failureRates;
vector<int> answer;
int p = stages.size();
for(int i=0; i<N; i++)
{
int stageCount = count(stages.begin(), stages.end(), (i+1));
float failureRate;
if(p != 0)
failureRate = (float)stageCount / (float)p;
else
failureRate = 0;
failureRates.push_back(failureRate);
p -= stageCount;
}
for(int i=0; i<failureRates.size(); i++)
{
int max_idx = max_element(failureRates.begin(), failureRates.end()) - failureRates.begin();
failureRates[max_idx] = FLAG;
answer.push_back(max_idx+1);
}
return answer;
}