주녘공부일지

[프로그래머스 C#] Lv.3 인사고과 본문

CodingTest/Programmers Lv.3

[프로그래머스 C#] Lv.3 인사고과

주녘 2024. 1. 31. 15:17

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1. 정답코드 및 핵심 아이디어, 유의사항

주어진 조건에 따라 주어진 사원 중에 0번 인덱스로 주어지는 완호의 등수를 구하는 문제

- 핵심은 자신을 제외한 모든 사원에 대해서 두 점수가 모두 높은 다른 사원이 있다면 인센티브 대상에서 제외되는 것

 -> 주어진 조건을 만족하는 숫자 + 1을 리턴하고 없으면 -1을 리턴하면 됨

 

0) 주어진 조건

- 주어진 두 개의 점수의 총합으로 순위를 산출

- 단, 모든 사원에 대해서 두 개의 점수가 모두 높은 사원이 있다면 대상에서 제외됨

 -> 두 개의 점수가 모두 높으면 총합이 높을 수밖에 없음

 

1) 연산 최적화

- 완호보다 총합이 높은 사원만 탐색 대상으로 둠

- 탐색 대상인 사원이 인센티브 대상이 되는지 판별할 때, 자신보다 총합이 낮은 사원하고는 비교하지 않음

 

주석 참조

    using System;
    using System.Collections.Generic;

    public class Solution
    {
        public class DataClass
        {
            public int score1; // 근무 태도 점수
            public int score2; // 동료 평가 점수
            public int total; // 근무 태도 점수 + 동료 평가 점수

            public DataClass(int score1, int score2)
            {
                this.score1 = score1;
                this.score2 = score2;
                total = score1 + score2;
            }
        }

        public int solution(int[,] scores)
        {
            int answer = 1; // 현재 완호의 등수를 나타냄
            var list = new List<DataClass>(); // 완호보다 총합이 높은 사원을 담을 리스트
            DataClass dataClass = new DataClass(scores[0, 0], scores[0, 1]); // 완호의 데이터

            // 완호보다 총합이 높은 사원만 추출
            for (int i = 1; i < scores.GetLength(0); i++)
                if (dataClass.total < scores[i, 0] + scores[i, 1])
                    list.Add(new DataClass(scores[i, 0], scores[i, 1]));

            // 총합 기준 내림차순 정렬
            list.Sort((x, y) => (x.total > y.total) ? -1 : 1);

            // 총합이 가장 큰 값부터 순서대로 체크
            for (int i = 0; i < list.Count; i++)
            {
                // 완호가 인센티브를 받지 못하는지 체크
                if (dataClass.score1 < list[i].score1 &&
                   dataClass.score2 < list[i].score2)
                    return -1;

                bool isCheck = true; // 해당 사원이 인센티브를 받는지 여부

                // 해당 사원보다 총합이 같거나 큰 대상하고만 비교
                for (int j = 0; j < i; j++)
                {
                    // 해당 사원이 인센티브를 받지 못하는지 체크
                    if (list[i].score1 < list[j].score1 &&
                       list[i].score2 < list[j].score2)
                    {
                        isCheck = false;
                        break;
                    }
                }

                // 나보다 높은 순위에 배치될 사원 발견
                if (isCheck)
                    answer++;
            }

            return answer;
        }
    }