https://school.programmers.co.kr/learn/courses/30/lessons/152995
(x, y) 에서 먼저 x를 기준으로 정렬하면 y만 신경쓰면 된다는 점을 생각해보자.
이때 y의 max 값이 정답에 영향을 끼치는데 뒤에서부터 갱신되는 y 값이 앞에 나오는 (x, y)에도 영향을 끼치므로 뒤에서부터 반복문을 수행하자.
여기서 같은 x값에는 y의 max 값이 영향을 받으면 안되는데 여기서 x는 오름차순, y는 내림차순으로 접근하면 x 값이 같아질 때 y 값도 자연스럽게 해결된다.
이는 max 값을 구하는 과정이기 때문에 가능한 조건이다.
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
int n;
struct Node {
int x, y, idx;
};
bool cmp(Node &a, Node &b)
{
if (a.x != b.x)
return a.x < b.x;
return a.y > b.y;
}
int solution(vector<vector<int>> v)
{
vector<Node> tmp;
n = v.size();
for (int i = 0; i < v.size(); i++)
{
int x = v[i][0], y = v[i][1];
tmp.push_back({ x, y, i });
}
sort(tmp.begin(), tmp.end(), cmp);
vector<pii> res = { { tmp.back().x + tmp.back().y, tmp.back().idx } };
int mx = tmp.back().y;
for (int i = (int)tmp.size() - 2; i >= 0; i--)
{
if (tmp[i].y < mx)
{
if (tmp[i].idx == 0)
return -1;
continue;
}
mx = max(mx, tmp[i].y);
res.push_back({ tmp[i].x + tmp[i].y, tmp[i].idx });
}
sort(res.rbegin(), res.rend());
int rank = 1;
if (res[0].second == 0) {
return 1;
}
for (int i = 1; i < res.size(); i++)
{
if (res[i].first != res[i - 1].first)
rank = i + 1;
if (res[i].second == 0)
return rank;
}
}