본문 바로가기
코테 준비

[프로그래머스] 인사고과

by 박수련 2024. 2. 29.

문제 요약

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

 

사원들의 근무태도점수와 동료평가점수가 scores 배열로 주어진다.
이때 임의의 사원보다 근무태도점수, 동료평가점수가 모두 낮은 사원이 있다면 인센티브를 받을 수 없다.

 

인센티브를 받는 사원들 중 근무태도점수와 동료평가점수의 합으로 석차를 매겼을 때 원호의 석차를 구하는 문제이다.

두 점수의 합이 같은 사원이 여러 명이라면 모두 동일 등수를 가지며,

그 다음 석차는 동일석차를 가지는 사람수만큼 뒤로 밀린다.
원호의 점수는 scores[0]로 주어진다.

 

첫번째 시도

접근

일단 근무태도점수, 동료평가점수를 내림차순 정렬을 하면 인센티브를 받지 못하는 사원들을 거를 수 있겠다고 생각했다.
근무태도점수가 같은 사원들 중 동료평가점수가 가장 높은 사원의 점수를 max_peer 변수에 저장한다.
그리고 근무태도점수가 가장 높은 사원이 아니라면 동료평가점수가 max_peer값보다는 커야 인센티브를 받을 수 있을 것이다.
작다면 scores배열에서 pop을 시켜주었다.

그리고 등수를 매기기위해 근무태도점수와 동료평가점수를 더해 result 배열에 넣어주고 원호의 점수의 합을 통해 인덱스 값을 반환했다.

테케가 84프로로 아직 성공하지 못했다.
원인을 좀 더 찾아보겠다.

 

-> 한참을 삽질하고 코드를 수정해봤는데 오히려 테케 통과 점수가 더 내려가서 일단 시간이 없으니 다른 풀이를 참고했다.

코드

def solution(scores):
    target = scores[0]
    summ = target[0] + target[1]

    # 인센티브 받는 사원 필터링
    scores.sort(key=lambda x: (x[0], x[1]), reverse=True)

    max_peer = scores[0][1]
    i = 1
    while i < len(scores):
        if scores[i][0] != scores[i - 1][0]:
            max_peer = max(max_peer, scores[i][1])

        if scores[i][1] < max_peer:
            # 완호가 인센티브를 받지 못할 때
            if scores[i] == target:
                return -1

            scores.pop(i)
            continue

        i += 1

    # 등수 매기기
    result = []
    for i in range(len(scores)):
        result.append(scores[i][0] + scores[i][1])
    result.sort(reverse=True)

    idx = result.index(summ)
    return idx

 

 

코드의 가독성을 위해 while문에서 for문으로 변경해줬더니 추가적으로 설정해줘야할 조건들이 많아졌다. 내가 봐도 코드의 허점이 보인다... 꼭 다시 성공시킬 것

def solution(scores):
    # 완호의 점수 저장
    wanho = scores[0]
    summ = wanho[0] + wanho[1]

    # 근무태도점수, 동료평가점수가 큰 순으로 정렬
    scores.sort(key=lambda x: (x[0], x[1]), reverse=True)

    tmp = scores[0][1]
    max_peer = tmp
    result = []
    for i in range(len(scores)):
        if wanho[0] < scores[i][0] and wanho[1] < scores[i][1]:
            return -1
        
        if scores[i][0]==scores[0][0]:
            continue

        # 근무태도점수가 달라질 때 == 줄었을 때
        if i>=1 and scores[i][0] != scores[i - 1][0]:
            max_peer = tmp
            tmp = scores[i][1]

        # 동료평가점수가 max_peer보다 같거나 크면 인센티브 o
        if scores[i][1] >= max_peer:
            result.append(scores[i][0] + scores[i][1])

        i += 1

    # 등수 매기기
    result.sort(reverse=True)
    idx = result.index(summ)

    return idx + 1

 

 

참고 코드

def solution(scores):
    wanho = scores[0]
    summ = wanho[0] + wanho[1]

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

    max_peer = 0
    result = 0
    for att, peer in scores:
        if wanho[0] < att and wanho[1] < peer:
            return -1

        if max_peer <= peer:
            max_peer = peer
            if att + peer > summ:
                result += 1

    return result + 1

 

내 풀이와는 다르게 두번째 인자를 오름차순으로 정렬을 했고

완호보다 점수 합이 높으면 result를 +1 시켜 점수 합에 대한 배열을 따로 두지 않았다. 

너무 깔끔한 풀이.. 

 

출처 https://www.ai-bio.info/programmers/152995