상세 컨텐츠

본문 제목

[프로그래머스] 152995. 인사고과| 정렬, 구현 | 파이썬, 소스코드, 정답

Coding Test/문제풀이

by yooputer 2023. 5. 23. 09:24

본문

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

 

프로그래머스

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

programmers.co.kr


문제 요약

  • 근무태도점수와 동료평가점수로 인센티브 지급 여부를 평가한다
  • 만약 자신보다 근무태도 점수와 동료평가점수 모두 높은 사원있다면 인센티브를 받지 못한다
  • 두 점수의 합으로 인센티브를 차등지급한다.
  • 원호(0번째 사원)의 석차를 구하라. 인센티브를 못받으면 -1을 반환한다.

문제 조건

입력

  • scores = [[a, b]] (a : 근무태도점수, b : 동료평가점수)

범위

  • 1 <= len(scores) <= 100,000
  • 0 <= a, b <= 100,000

시행착오

무식하게 2중for문 돌리지 말고 정렬을 해서 똑똑하게 풀어야 한다는 것을 알았지만 도저히 내 머리로는 생각해낼 수가 없었다. 😞

그래서 무식하지만 확실한 2중 for문을 돌렸으나 당연히 시간초과

 

그래서 다른분의 풀이를 보았다. (좋은 풀이 감사합니다👍)

https://school.programmers.co.kr/questions/42864

 

너무나 간결한 코드이지만 내 머리속에 온전히 받아들이기 쉽지 않았다.

최대한 이해한 것을 기록해보려고 한다. 


핵심 개념

  • 근무태도점수는 내림차순으로, 동료점수는 오름차순으로 정렬한다
  • 원호의 근무태도점수와 동료평가점수가 다른 사원보다 낮다면 -1을 반환한다
  • i번째일 때의 동료평가점수의 최대값을 max_dongryo에 저장한다.
    만약 i번째일 때의 동료평가점수가 max_dongryo보다 크면 원호의 총합 점수와 비교하고, 만약 원호의 점수가 더 낮다면 원호의 석차에 1을 더한다.
    • 태도점수는 내림차순이기 때문에 동료평가점수가 max_dongryo보다 더 크거나 같지 않으면 i번째 사원의 총합점수는 i-1번째까지의 사원보다 작다.
      따라서 i번째 사원의 동료평가점수가 max_dongryo보다 크거나 같을때만 원호의 총합 점수와 비교하고 원호의 석차를 갱신한다.

소스코드

def solution(scores):
    wanho_score = scores[0]

    scores.sort(key=lambda x: (-x[0], x[1]))

    max_dongryo = 0
    answer = 1
    for s in scores:
        if wanho_score[0] < s[0] and wanho_score[1] < s[1]:
            return -1

        if s[1] >= max_dongryo:
            if sum(wanho_score) < sum(s):
                answer += 1
            max_dongryo = s[1]

    return answer

 

관련글 더보기