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;
}
}