나의 기록, 현진록

[Swift] 프로그래머스 코딩테스트 연습 > 연습문제 > 인사고과 본문

Programming/Algorithm & Data Structure

[Swift] 프로그래머스 코딩테스트 연습 > 연습문제 > 인사고과

guswlsdk 2023. 5. 3. 16:15
반응형

 

 

 

프로그래머스

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

programmers.co.kr

 

못 풀겠어서 풀이를 검색했고 이걸 왜 못 풀었나 싶어서 죄책감과 함께 오랜만에 글 씁니다.

 

문제 풀이

근무 태도와 동료 평가 점수 "모두" 다른 사원보다 낮을 경우 인센티브를 제외한다는 조건을 보고 어떤 방식으로든(이중 포문, 정렬 등) 탐색을 생각했다. 하지만 score에 길이가 최대 10만이기 때문에 O(N)으로 풀 수 있는 방법을 생각했는데 생각이 나질 않았다.

 

근무 태도와 동료 평가 점수 두 가지를 고려해야 하기 때문에 어려웠다. 정렬을 사용한다는 건 알았는데 말이지...

인센티브를 제외할 놈만 쉽게 알아낼 수 있도록 정리해보자...!

 

1. 근무 태도와 동료 평가 점수 둘 중 하나를 선택해서 먼저 내림차순으로 정렬한다.

근무 태도 점수를 내림차순으로 하기로 한다면 i 번째 근무태도는 i+1 번째 근무 태도보다 크거나 같을 것이다.

그렇다면 i 사원 이후의 i+1..2...3..4..........n 사원들은 근무 태도 점수가 낮은 경우에 모두 해당된다.

 

2. 인센티브 제외할 놈을 찾기 위해서는 근무 태도 점수가 같을 경우 동료 평가 점수는 오름차순으로 정렬되어야 한다. 

이때 i 사원 이후의 동료 평가 점수가 낮은 경우만 고려하면 "모두" 낮은 경우에 해당 된다. 

 

 

[[2,2],[1,4],[3,2],[3,2],[2,1]] -> [[3,2], [3,2], [2,1], [2,2], [1,4]]

 

import Foundation
func solution(_ scores:[[Int]]) -> Int {
    var scores = scores
    let wan = scores.first!
    var result = 1
    scores.sort{ $0[0] == $1[0] ? $0[1] < $1[1] : $0[0] > $1[0]}
    var maxScore = 0
    for score in scores {
        if maxScore > score[1]{
            if score == wan{
                return -1
            }
        }else{
            maxScore = max(maxScore, score[1])
            if score[0] + score[1] > wan[0] + wan[1]{
                result += 1
            }
        }
        
    }
    return result
}
반응형