8. 인사고과

aj4941·2023년 8월 31일
0

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;
    }
}
profile
안녕하세요 aj4941 입니다.

0개의 댓글