ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] 인사고과
    알고리즘 2024. 4. 19. 21:48

    문제

    완호네 회사는 연말마다 1년 간의 인사고과에 따라 인센티브를 지급합니다.

    각 사원마다 근무 태도 점수와 동료 평가 점수가 기록되어 있는데 만약 어떤 사원이 다른 임의의 사원보다 두 점수가 모두 낮은 경우가 한 번이라도 있다면 그 사원은 인센티브를 받지 못합니다.

    그렇지 않은 사원들에 대해서는 두 점수의 합이 높은 순으로 석차를 내어 석차에 따라 인센티브가 차등 지급됩니다. 이때, 두 점수의 합이 동일한 사원들은 동석차이며,

    동석차의 수만큼 다음 석차는 건너 뜁니다. 예를 들어 점수의 합이 가장 큰 사원이 2명이라면 1등이 2명이고 2등 없이 다음 석차는 3등부터입니다.

    각 사원의 근무 태도 점수와 동료 평가 점수 목록 scores이 주어졌을 때, 완호의 석차를 return 하도록 solution 함수를 완성해주세요.

    풀이

    처음에는 모든 것들을 조사 해야 한다고 생각했었다.
    하나의 점수에 따라 모든 숫자를 비교를 하여 순위를 매기는 방식으로 구현을 했다.
    Level 3이 이렇게 간단할리가 없는데 설마 했지만 역시나였다.
    두번의 반복때문에 O(n^2)가 나오기 때문에 시간초과가 나왔다.

    한번의 반복만으로 이를 구별해야 하는데 방법을 찾지 못해 여러 힌트를 보았다.
    중요한 것은 정렬이였다.

    근태점수에 따라 내림차순, 합이 같은 경우에 따라 오름차순으로 배열을 정렬해준다.
    이때 동료평가 점수의 최댓값 갱신을 위해 반복을 돌려준다.
    -> 최댓값 갱신이 되지 않는다?? 근태 점수를 이미 내림차순으로 했기 때문에 근태 점수는 이미 낮고, 평가점수가 갱신이 되지 않기 때문에 평가 점수마저 적다는 뜻 이므로 이는 제외시켜 준다.

    이를 이용하여 원호의 점수를 계산한다.

    import java.util.*;
    import java.lang.*;
    
    class Solution {
        static int MIN = -1;
        static Integer[] sumScores;
        public int solution(int[][] scores) {
            int answer = 1;
            int length = scores.length;
            sumScores = new Integer[length];
            int[] target = scores[0];
    
            Arrays.sort(scores, new Comparator<int[]>() {
                @Override
                public int compare(int[] o1, int[] o2) {
                    if (o1[0] < o2[0]) {
                        return 1;
                    }
                    else if (o1[0] == o2[0]) {
                        if (o1[1] > o2[1]) {
                            return 1;
                        }
                        return -1;
                    }
                    return -1;
                }
            });
    
            int max = 0;
            for (int[] score : scores) {
    
                if (score[1] < max) {
                    if (score[0] == target[0] && score[1] == target[1]) {
                        return -1;
                    }
                    continue;
                }
    
                max = Math.max(max, score[1]);
                if (target[0] + target[1] < score[0] + score[1]) {
                    answer++;
                }
            }
            return answer;
        }
    }

    https://github.com/Win-9/Algorism/tree/main/programers/%EC%9D%B8%EC%82%AC%EA%B3%A0%EA%B3%BC

    728x90

    '알고리즘' 카테고리의 다른 글

    [BOJ] 노드 사이의 거리  (1) 2024.04.26
    [BOJ] 암호 만들기  (0) 2024.04.25
    최단거리 알고리즘을 아라보자  (0) 2024.04.16
    [BOJ] 최소비용  (0) 2024.04.16
    [BOJ] 택배배송  (0) 2024.04.12

    댓글

Designed by Tistory.