알고리즘/PROGRAMMERS (Python)

[ 프로그래머스 ][ Lv3 ] 인사고과 ( 파이썬 Python )

Heeto 2023. 3. 28. 12:28
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/152995

 

코드


def solution(scores):
    
    ho = scores[0]
    sum_ho = sum(scores[0])
    
    scores.sort(key=lambda x: (-x[0],x[1]))
    
    answer = 0
    before = 0
    for score in scores:
        if ho[0] < score[0] and ho[1] < score[1]:
            return -1
        if before <= score[1]:
            if sum(score) > sum_ho:
                answer += 1
            before = score[1]
            
    return answer+1

 

풀이


'''
4 4 / 3 3 / 2 4 가 있을 때 3 3과 2 4는 같은 합임에도 3 3은 4 4보다 모두 작아서 고과를 받지 못한다.
고과를 받지 못하는 인원 제외 -> 완호가 포함되면 -1 -> 완호보다 합이 큰 사람의 수 세기
n번 돌면서 두 수가 종합적으로 가장 큰 사람 찾기? -> 판단 불가능
점수별로 두 번 정렬해서 2n번 탐색으로 내 앞의 친구보다 작으면 제외?
    - 17 5 / 6 3 / 4 4 같은 경우라면? 내 앞보다는 큰 것도 있지만 내 앞앞보다는 모두 작다.
    - 두번째로 정렬하게 되면 5 17 / 4 4 / 3 6 이 되어서 일단 제외가 되긴 한다.
    - 모든 경우에서 되는지는 확인하기 어렵다.
+)
합, 첫번째, 두번째 를 기준으로 정렬한다면 내 바로 앞에 있는 친구와만 비교할 수 있을까?

'''

문제를 해결하면서 내 생각을 정리한 내용이다.

 

두 번 정렬하는 방법으로 시도해보았지만 결국 실패했다. 그래서 블로그를 참고했으나 아이디어도 좀 비슷했고 정렬의 기능을 조금만 더 확장해서 해석했다면 충분히 해결가능했을 것 같다. 정렬의 기능을 확장해서 해석한다는 말은 정렬로 어떤 조건을 만족시킬 수 있는지를 더 깨닫는 것을 말한다.

 

 

  • 첫 번째 원소를 기준으로 내림차순 정렬한다 -> 나보다 뒤에 있는 사람들은 나보다 근무태도 점수가 같거나 낮다.
    • 근무태도를 기준으로 오름차순 정렬함으로써 동료평가 점수만 신경쓰도록 한다.
  • 두 번째 원소를 기준으로 오름차순 정렬한다 -> 나보다 뒤에 있는 사람들은 나보다 동로평가 점수가 같거나 높다.
    • 근무태도 점수는 내 앞에 있는 사람들이 나보다 높거나 같으므로 지금까지의 동료평가 최대 점수가 내 점수보다 높다면 나는 고과에서 제외된다.
    • 같은 근무태도 점수에서 동료평가 점수가 나보다 높다고 제외되는 것을 방지하기 위해 내림차순으로 정렬한다.

 

이런 정렬방식을 통해 생각보다 간단하게 고과에서 제외될 사람들을 걸러낼 수 있다.