시간초과때문에 고생을 많이 한 문제이다. 첫풀이와 두번째 풀이를 합치고 최적화하여 통과하였다.
첫번째 풀이는 인덱스를 주어진 벡터에 추가해주고 정렬한다음에 각 사람에 대해 인센티브 여부를 체크해 조건이 안된다면 점수를 -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;
}