코딩관계론

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

개발/알고리즘

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

개발자_티모 2023. 3. 20. 19:50
반응형

[문제 설명]

인센티브를 받는  사람 중 완화가 몇 등인지 구하는 문제였다.

인센티브를 받을 수 있는 조건은 다음과 같다.

  • 사원.근무태도 >= 사원들.근무태도 or 사원.동료평가 >= 사원들.동료평가

둘 중에 하나라도 높은 것이 있다면 인센티브를 받을 수 있다

 

[해결 방법]

주어진 예시(sources = [[x, y], [x,y]...])를 도식화 시키면 아래와 같은 모습이 나타나게 된다. 여기서 빨간색 부분은 인센티브를 받을 수 없는 사람들의 영역을 나타낸다.

 

아래의 사진을 보면 두 가지의 특징을 획득할 수 있다

  • x의 크기 순서 및  만약 x의 크기가 같으면 y 값이 작은 사람부터 인센티브의 여부를 우선적으로 판별할 수 있다.
  • x가 0으로 가까워 질 수록 y 값이 커지는 특징을 확인할 수 있다. 왜냐하면 포함되지 않기 위해선 y가 커져야만 하기 때문이다.

그럼  첫 번째 특징으로 인해 x는 내림차순 y는 오름차순으로 정렬을 수행한다면 인센티브 여부를 판별할 수 있게 된다.

두 번째 특징으로 max_height를 기록하면서 max_height보다 크거나 같을 때 인센티브를 받을 수 있다고 기록하면 해당 문제를 수월하게 해결할 수 있다.

 

[해결 과정에서 발생한 문제와 해결방법] 

  • 순위를 구하기 위해 인센티브를 받을 수 있는 사람의 점수를 배열에다 저장하고, 그 중에 타겟 값이 있는지 비교했다. 하지만 아래와 같은 방법으로는 정답을 획득할 수 없었다. 왜냐하면 score의 합은 같고 x, y의 좌표가 다를 경우가 존재했기 때문이다.
sum = 0
for score in get_incentive_scores:
  if score == target:
      return score의 index
return -1

 

 

[정답 코드]

def solution(scores):
    target_score = sum(scores[0])
    target_x, target_y = scores[0]
    scores.sort(key=lambda s: (-s[0], s[1]))

    max_height, answer = 0, 1
    alived_score = []
    for score in scores:
        x, y=score

        if target_x < x and target_y < y:
            return -1

        if max_height <= y:
            if target_score < x + y:
                answer += 1
            max_height = y
    
    return answer

if __name__ == "__main__":
    score = [[2,2],[1,4],[3,2],[3,2],[2,1]]
    print(solution(scores=score))
반응형