<Lv.3> 인사고과 (프로그래머스 : C#)

이도희·2023년 11월 6일
0

알고리즘 문제 풀이

목록 보기
180/185

https://school.programmers.co.kr/learn/courses/30/lessons/152995

📕 문제 설명

근무 태도 점수와 동료 평가 점수가 주어질 때 두 점수의 합이 높은 순으로 석차를 내어 석차에 따라 인센티브가 차등 지급됨 (이때, 동석차 수만큼 다음 석차는 건너 뜀)

단, 다른 임의의 사원보다 두 점수가 모두 낮은 경우가 존재하면 인센티브 X

완호의 점수, scores[0]이 주어질 때 완호의 석차 반환하기

  • Input
    사원들의 근무 태도 점수와 동료 평가 점수
  • Output
    완호의 석차

예제

시도 1.

완전 탐색 (시간 초과)

해당 사원이 등수 비교에 포함 되는지 완전 탐색으로 정리한 다음 완호의 석차를 구하는 방식 (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;
    }
}

결과

profile
하나씩 심어 나가는 개발 농장🥕 (블로그 이전중)

0개의 댓글