카테고리 없음

[파이썬] 인사고과

위그든씨 2023. 5. 11. 19:10

문제 설명

https://school.programmers.co.kr/learn/courses/30/lessons/152995

 

프로그래머스

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

programmers.co.kr

문제 풀이

  • 원호가 높은 점수에서부터 몇 등인지 구하는 문제이니 원호보다 같거나 낮은 점수는 구할 필요 없음
    • x+y <= (wx+wy) continue
  • 특정 인원이 어떠한 인원보다 [0]과[1] 값이 작을 경우에는 그 사람은 등수에서 제외 됨.
    • 원호의 값을 저장
    • (wx,wy) 이 값이 특정 원소의 값 x,y 보다 작다면 원호는 석차에서 제외되므로 -1 리턴
  • 위 조건은 원호뿐만 아니라 원호보다 높은 점수인 사람에게도 적용 됨. ( 이 인원의 수를 찾아야 함 )
  • 리스트의 길이는 10만이므로 O(n)으로 처리할 생각
  • scores를 [0]을 기준으로 내림차순으로, [1]을 기준으로 오름차순 정렬
    • 정렬 후 맨 첫 원소를 기준으로 px와 py를 지정했다면 탐색을 했을 시 ( x,y = score[i] ) 
    • x가 px와 같다면 이 사람은 석차에 포함 됨. ( x,y 모두 작아야 포함 x)
    • px 가 같다면 탐색을 할 수록 y의 값은 점점 커질테니 py는 y 값으로 업데이트
    • 이 후 px와 다른 x가 나왔을 때 ( px보다 작은 x )
      • py는 이전 px값들 중 가장 큰 y 값이므로 다른 x의 y값이 py 보다 작다면 이 원소는 석차에 포함 안됨
      • 만약 py보다 큰 y 라면 이 원소는 석차에 포함 될 것이니 py를 y값으로 업데이트 

소스 코드

def solution(scores):
    n = len(scores)
    wx,wy=scores[0]
    w = wx+wy
    scores.sort(key=lambda x:(-x[0],x[1]))    
    px = scores[0][0]
    py = scores[0][1]
    answer=1
    for i in range(n):
        x,y = scores[i]
        if x>wx and y>wy:
            return -1
        if x+y<=w:
            continue
        if x==px:
            answer+=1
            py = y
        else:
            if py>y:
                continue
            else:
                py = y
                px = x
                answer+=1

            

    return answer

print(solution([[2,2],[1,4],[3,2],[3,2],[2,1]]))

# 어떤 사원이 다른 임의의 사원보다 두 점수 모두 낮으면 인센티브 x
# 그렇지 않은 사원은 두 점수 합이 높은 순으로 인센티브 지급
# 동일 점수일시 그 수만큼 다음 석차는 건너 뜀
# 1등 2명일시, 1등 2명. 3등 1명

# scores 길이는 10만 이하
# [0]은 완호 점수
# 완호가 못 받을 시 -1
# 5 번째 사원은 3 번째 또는 4 번째 사원보다 근무 태도 점수와 동료 평가 점수가 
# 모두 낮기 때문에 인센티브를 받을 수 없습니다.
# 2 번째 사원, 3 번째 사원, 4 번째 사원은 두 점수의 합이 5 점으로 최고점이므로 1 등입니다.
# 1 등이 세 명이므로 2 등과 3 등은 없고 1 번째 사원인 완호는 두 점수의 합이 4 점으로 4 등입니다.