https://school.programmers.co.kr/learn/courses/30/lessons/152995
근무 태도 점수와 동료 평가 점수가 주어질 때 두 점수의 합이 높은 순으로 석차를 내어 석차에 따라 인센티브가 차등 지급됨 (이때, 동석차 수만큼 다음 석차는 건너 뜀)
단, 다른 임의의 사원보다 두 점수가 모두 낮은 경우가 존재하면 인센티브 X
완호의 점수, scores[0]이 주어질 때 완호의 석차 반환하기
완전 탐색 (시간 초과)
해당 사원이 등수 비교에 포함 되는지 완전 탐색으로 정리한 다음 완호의 석차를 구하는 방식 (21, 24 테케 시간 초과)
원래 25도 통과 안되었었는데 원호보다 낮은 점수는 무시하는 식으로 if문 추가하니 25까지는 통과됨
using System;
using System.Collections.Generic;
using System.Linq;
public class Solution {
public int solution(int[,] scores) {
int answer = 0;
List<int> scoreList = new List<int>();
int currentScore = scores[0, 0] + scores[0, 1];
for (int i = 0; i < scores.GetLength(0); i++)
{
bool hasIncentive = true;
int firstScore = scores[i, 0];
int secondScore = scores[i, 1];
if (currentScore > firstScore + secondScore) continue;
for (int j = 0; j < scores.GetLength(0); j++)
{
if (i == j) continue;
if (firstScore < scores[j, 0] && secondScore < scores[j, 1])
{
if (i == 0) return -1;
hasIncentive = false;
break;
}
}
if (i > 0 && hasIncentive) scoreList.Add(firstScore + secondScore);
}
scoreList = scoreList.OrderByDescending(x => x).ToList();
for (int i = 0; i < scoreList.Count; i++)
{
if (scoreList[i] <= currentScore)
{
answer = i + 1;
break;
}
}
if (answer == 0) answer = scoreList.Count + 1;
return answer;
}
}
c# 이차원 배열 정렬이 안되어서 돌아돌아 풀었다..
결국 한 점수를 기준으로 정렬하고 그 다음 점수를 기준으로 정렬하게 되면 다음과 같이 인센티브 여부를 결정할 수 있다.
다음과 같이 정렬되었을때 최대 근무 태도 점수를 가지는 그룹은 무조건 인센티브를 받는다. 근무 태도 점수가 이보다 낮은 경우들은 동료 평가 점수가 더 높아야지만 인센티브를 받을 수 있다. (즉, 최대 근무 태도 점수를 가지는 사원들 중 최대 동료 평가 점수를 넘어야 인센티브 받기 가능)
(3, 3) (3, 2) (2, 4) (2, 1)
using System;
using System.Collections.Generic;
using System.Linq;
public class Solution {
public int solution(int[,] scores) {
int answer = 1;
List<(int, int)> scoreList = new List<(int, int)>();
for (int i = 1; i < scores.GetLength(0); i++)
{
scoreList.Add((scores[i, 0], scores[i, 1]));
}
// 근무 태도 기준 정렬 => 동료 평가 기준 정렬
// 근무 태도 높은 그룹의 최대 동료 평가 점수보다 낮으면 incentive 못받음
scoreList = scoreList.OrderByDescending(x => x.Item1).ThenBy(x => x.Item2).ToList();
int currentScore = scores[0, 0] + scores[0, 1];
int maxEmployeeEvalScore = 0;
foreach (var score in scoreList)
{
if (scores[0, 0] < score.Item1 && scores[0, 1] < score.Item2) return -1;
if (maxEmployeeEvalScore <= score.Item2) // incentive 받는 경우 (한 점수는 더 큰게 보장된 케이스)
{
if (currentScore < score.Item1 + score.Item2) answer += 1;
maxEmployeeEvalScore = score.Item2;
}
}
return answer;
}
}