코드
def solution(k, m, score): # 사과 최대 점수, 한 상자 사과 개수, 사과 점수
answer = 0 # 이익
score.sort(reverse=True)
for i in range(0, len(score), m):
if len(score[i:i+m]) == m:
answer += min(score[i:i+m]) * m
return answer
문제 이해가 너무 어려웠다...
분명히 이 글을 읽는 사람도 문제 이해가 안 되어서 찾아봤을 것이라 생각한다.
나 역시도 다른 분들의 글을 읽어봤지만 이해가 되지 않아서 코드에 머리를 끼워 맞춰 겨우 이해한 격이니.
문제가 길어서 무슨 말인지 이해가 안 되겠지만, 플로우를 설명하자면 다음과 같다.
주어지는 score를 내림차순 정렬하여 m개씩 분할하면 그것이 한 상자에 담기는 사과의 점수들이다.
그런 다음 각 상자에서 가장 낮은 점수 * m을 하면 그 값이 해당 상자의 점수이고 이를 모두 더하면 구하고자 하는 답이다.
score를 내림차순 정렬하는 이유는 문제에서 과일장수가 얻을 수 있는 최대 이익을 구하라고 했기 때문이다.
최대 이익을 구하려면 각 상자의 점수들도 최대이어야 할 것이다. 그러므로 내림차순을 하여 큰 값부터 정렬한다.
내림차순 한 score를 m 개씩 슬라이싱 한다. 이는 한 상자에 m개씩 담겨야 하기 때문이다.
for문을 통해 0부터 len(score)까지 반복하되, m씩 증가시킨다.
슬라이싱 한 score[i:i+m]의 길이가 m인지 확인한다. 상자에는 m개씩 담겨야 하므로 m개보다 작은 개수의 사과는 버린다.
m개의 사과가 담긴 해당 상자의 가격을 구한다.
가격은 최저 점수 * m 이므로 min(score[i:i+m]) * m이 된다.
이렇게 구한 가격은 answer에 계속해서 누적시켜 주고 모든 과정이 완료되면 사과 장수가 얻는 이익 answer를 리턴해주면 된다.
문제에서 k가 주어진 이유는 아직 모르겠다. 코드에서 k는 쓰이지 않았고, 문제 설명에서도 k가 꼭 필요한 존재인지는 파악할 수 없었다..