카테고리 없음
[파이썬] 인사고과
위그든씨
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 등입니다.