[프로그래머스] 2019 KAKAO BLIND RECRUITMENT Lv1.실패율

박민주·2021년 11월 14일
0

Programmers

목록 보기
5/13
post-thumbnail

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로 선정되지 않게 처리했다

배운 점

1. max()와 max_element() 차이

  • 둘 다 에서 제공하는 함수들인데
    max(a, b)는 둘 중 더 큰 수를 찾을 수 있고,
    max_element(v.begin(), v.end())는 배열이나 벡터에서 큰 수를 찾을 수 있다

2. 예외 처리를 주의깊게 보자..!

CODE

#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;
}
profile
Game Programmer

0개의 댓글