문제 요약
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 시켜 점수 합에 대한 배열을 따로 두지 않았다.
너무 깔끔한 풀이..
'코테 준비' 카테고리의 다른 글
[프로그래머스] 혼자 놀기의 달인 (2) | 2024.02.29 |
---|---|
[프로그래머스] 공원 산책 (1) | 2024.02.29 |
[프로그래머스] 양궁대회 (1) | 2024.02.29 |
[프로그래머스] 우박수열 정적분 (0) | 2024.02.29 |
[프로그래머스] 달리기 경주 (0) | 2024.02.29 |