반응형
https://school.programmers.co.kr/learn/courses/30/lessons/152995
문제 요약) {근무 태도 : X, 동료 평가 : Y} 쌍이 배열로 주어진다.
- 0번 index 의 X0, Y0 값이 k 번째 index 의(0 < k < n) Xk, Yk 보다 작은 경우 인센티브를 못받는다.
- X0 + Y0 이 Xk + Yk 보다 작은 경우 순위에서 밀린다.
[풀이]
- 각 입력은 100,000 보다 작거나 같으므로, O(N) 혹은 O(NlogN) 알고리즘을 생각해야 함.
- 등수 = 전체 사원수 - 인센티브를 받지 못하는 사원수 - 0번째 사원보다 점수가 크거나 같은 사원수가 된다.
- i 번째의 X 와 Y 둘 모두 j 번째의 X 와 Y 보다 작은 경우 순위에서 제외되기 때문에 기준을 X로 잡고,
동일한 X 의 값에 포함되는 최대의 Y 로 최적화 시킨다. MXY[Xi] = max(MXY[Xi], Y) - 0~99,999 범위에 대해서 내림차순으로 스위핑하며 MXY[X] 보다 MXY[X + 1] 의 값이 더 크다면 최적화 해준다.
- {{9, 8}, {8, 9}, {7, 8}, {6, 10} ...} 이 있는 경우 MXY[9] = 8, MXY[8] = 9, MXY[7] = 9, MXY[6] = 10 ... 로 정리된다
- 스위핑이 끝나면, MXY[Xi] 값이 MXY[Xi + 1] 보다 작은 경우, Xi, Yi 보다 큰 사원이 있기 때문에 i 번째 사원은 인센티브를 못받는다.
#include <string>
#include <vector>
using namespace std;
int solution(vector<vector<int>> scores) {
int answer = scores.size(), sm = scores[0][0] + scores[0][1];
vector<int> MXY(100001, 0);
for (int i = 1; i < scores.size(); i++) {
MXY[scores[i][0]] = max(MXY[scores[i][0]], scores[i][1]);
}
for (int i = 99999; i >= 0; i--) {
MXY[i] = max(MXY[i + 1], MXY[i]);
}
if (MXY[scores[0][0] + 1] > scores[0][1]) {
return -1;
}
for (int i = 1; i < scores.size(); i++) {
if (MXY[scores[i][0] + 1] > scores[i][1]) {
answer--;
}
else {
if (sm >= scores[i][0] + scores[i][1]) {
answer--;
}
}
}
return answer;
}
반응형
'Algorithm' 카테고리의 다른 글
[프로그래머스] 3 x n 타일링 문제 풀이 (c++) (0) | 2024.12.03 |
---|---|
[프로그래머스] 뒤에 있는 큰 수 찾기 (c++) (0) | 2024.11.29 |
[프로그래머스] 조이스틱 (c++) (0) | 2024.05.04 |
[프로그래머스] N으로 표현 (c++) (0) | 2024.04.30 |
[프로그래머스] 광물 캐기 (c++) (0) | 2023.06.16 |