알고리즘

프로그래머스 - 인사고과

최데브 2024. 8. 28. 20:50

https://school.programmers.co.kr/learn/courses/30/lessons/152995?language=kotlin

 

프로그래머스

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

programmers.co.kr

 

처음에는 완호의 점수만 생각하고 필터링을 했는데

문제를 잘 읽어보면 임의의 직원도 다른 직원에 비해 두 점수가 모두 낮으면 인센티브에서 제외된다는걸

먼저 처리해줘야했다. 이를 위해서는 모든 직원들을 다 체크해볼 필요가 있었는데

 

2중 for 문은 절대로 쓰기 싫었기에 고민을 하다가

정렬을 하기로 했다.

하나를 기준으로 정렬을 해두면 두 점수 모두 확인할 필요 없이

나머지 점수만 비교해주면 되기 때문에 시간복잡도를 줄일 수 있었다.

class Solution {
    fun solution(scores: Array<IntArray>): Int {
        val oneho = scores[0]
        var maxSecondScore = 0
        val filteredScores = mutableListOf<IntArray>()

        // scores를 첫 번째 점수를 기준으로 내림차순 정렬
        val sortedScores = scores.sortedWith(compareByDescending<IntArray> { it[0] }.thenBy { it[1] })

        // 두 점수가 모두 낮은 사원을 필터링
        for (score in sortedScores) {
            // 현재 점수의 두 번째 점수가 이전까지의 최대 두 번째 점수보다 작으면 인센티브 X
            if (score[1] < maxSecondScore) {
                // 완호가 인센티브 자격이 없다면 -1 반환
                if (score.contentEquals(oneho)) {
                    return -1
                }
                continue
            }
            
            // 두 번째 점수의 최대값을 갱신
            maxSecondScore = maxOf(maxSecondScore, score[1])
            filteredScores.add(score)
        }


        val scoreSums = filteredScores.map { it[0] + it[1] }
        val sortedSums = scoreSums.sortedDescending()
        val onehoScoreSum = oneho[0] + oneho[1]
        val rank = sortedSums.indexOf(onehoScoreSum) + 1
        
        return rank
    }
}
반응형