C++:: 프로그래머스 < 인사고과 >

jahlee·2023년 5월 1일
0

프로그래머스_Lv.3

목록 보기
6/29
post-thumbnail

시간초과때문에 고생을 많이 한 문제이다. 첫풀이와 두번째 풀이를 합치고 최적화하여 통과하였다.

첫번째 풀이는 인덱스를 주어진 벡터에 추가해주고 정렬한다음에 각 사람에 대해 인센티브 여부를 체크해 조건이 안된다면 점수를 -1로 변환하여 마지막에 몇등인지를 세주는 방식이었다.
이방식은 22, 24, 25 테케에서 시간초과가 났다. 아마도 scores의 크기가 10만개일때 너무 많이 계산을 해서 시간초과가 난거같다.

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

bool compare(vector<int>a, vector<int>b)
{//점수합으로 정렬
    if (a[0]+a[1] == b[0]+b[1]) return a[2] < b[2];
    return a[0]+a[1] > b[0]+b[1];
}

int solution(vector<vector<int>> scores)
{
    int size=scores.size();
    for(int i=0;i<size;i++) scores[i].push_back(i);//인덱스 추가 
    sort(scores.begin(),scores.end());//정렬
    for(int i=0;i<size;i++)
    {
        for(int j=i+1;j<size;j++)
        {//각 점수들 비교해서 인센티브 자격있는지 체크
            if(scores[i][0] < scores[j][0] && scores[i][1] < scores[j][1])
            {없다면
                scores[i][0] = -1;
                scores[i][1] = -1;
                break;
            }
        }
    }
    sort(scores.begin(),scores.end(),compare);//점수 합으로 정렬
    for(int i=0;i<size;i++)
        if (scores[i][2] == 0)
            if (scores[i][0] != -1) return (i+1);//완호 점수면
            else return -1;//완호 자격미달이면
}

두번째 풀이는 정렬을 하지않고 완호의 점수를 기준으로 세어주었는데 이렇게 풀게되면 완호보다 도합 점수가 크지만 인센티브를 못받게 되는 경우가 많다면 비교를 너무 많이해서 첫번째 풀이와 똑같은 테케에서 시간초과가 나는것같다.

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

bool is_incentive(vector<int> c, vector<vector<int>> scores)
{//인센티브 받을수 있는지 없는지
    for(auto score : scores)
        if(c[0] < score[0] && c[1] < score[1]) return false;
    return true;
}

int solution(vector<vector<int>> scores)
{
    int answer = scores.size()+1, wanho=scores[0][0] + scores[0][1];
    for(auto c : scores)//완호 인센티브 자격되는지
        if (scores[0][0] < c[0] && scores[0][1] < c[1]) return -1;
    for(auto c : scores)//완호가 도합점수보다 크거나 같은경우 || 도합점수가 더크지만 인센티브가 아닌경우(이때 너무 많이 계산함)
        if (wanho >= c[0] + c[1] || !is_incentive(c, scores)) answer--;
    return answer;
}

정답 코드

최적화를 위해 두방식을 적당히 섞었다.

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int solution(vector<vector<int>> scores)
{
    int answer = scores.size()+1, wanho=scores[0][0] + scores[0][1], size = scores.size();
    for(auto c : scores)// 완호의 인센티브 자격 확인
        if (scores[0][0] < c[0] && scores[0][1] < c[1]) return -1;
    sort(scores.begin()+1, scores.end());//완호 점수를 제외하고 오름차순 정렬
    for(int i=1;i<size;i++)
    {
        if (wanho >= scores[i][0] + scores[i][1]) continue;//최적화를 위해 완호점수가 해당 도합점수보다 크다면 넘긴다.
        for(int j=i+1;j<size;j++)
        {
            if(scores[i][0] < scores[j][0] && scores[i][1] < scores[j][1])
            {//도합점수는 완호보다 크지만 인센티브를 못받는 경우
                answer--;//등수 올려줌
                break;
            }
        }
    }
    for(auto c : scores) if (wanho >= c[0] + c[1]) answer--;//완호가 점수 더 크거나 같다면 등수 올려줌
    return answer;
}

0개의 댓글