<로직 고민>
- 음 뭔가...점수가 제일 높은 순대로 조합해서 상자를 빼서 score에서 이미 나간 사과들을 빼는 형식으로 하면 되지 않을까? 하는 생각이 든다
- 일단 score를 점수가 높은 순으로 정렬을 해야겠다는 생각도 들고
def solution(k, m, score):
answer, box = 0, []
score.sort(reverse=True)
while len(score):
box.append(score.pop(0))
if len(box) == m:
answer += min(box) * m
box = []
return answer
- 이렇게 하니까 답은 나오는데 테스트 5개에서 시간초과가 뜬다
- k를 활용하지 않은 게 문제이려나...while도 문제겠네 score 최대 길이가 1,000,000이니까..
- 흠..그니까 정답은 (min(k) * m * (k의 개수 // m) + (min((k-1)) * m ((k-1)의 개수 // m) + ...
- 이런 식으로 나오는잖아
- 이것저것 고민하다가 로직을 바꿨다
- 일단 사과를 점수가 낮은 순으로 정렬하고 len(score) % m으로 남는 사과의 수를 box변수에 담는다
- 그다음 score를 슬라이싱할 건데 버려지는 사과의 수가 담긴 box부터 시작해서 m개씩 슬라이싱한다
- 그럼 각 상자의 가장 낮은 점수의 사과가 리스트에 담긴다
- 리스트를 for문을 돌려 각 요소에 곱하기 m를 하면서 answer에 더해준다
- 후...드디어 정답......1시간 반 동안 이 문제 푼 듯...
- 점수도 높다 10점 ㄷㄷ
<완성된 코드>
def solution(k, m, score):
answer = 0
score.sort()
box = len(score) % m
price = score[box::m]
for i in price:
answer += i * m
return answer
print(solution(3, 4, [1, 2, 3, 1, 2, 3, 1])) # 8
print(solution(4, 3, [4, 1, 2, 2, 4, 4, 4, 4, 1, 2, 4, 2])) #33
<다른 사람 풀이>
- 천재풀이1
def solution(k, m, score):
return sum(sorted(score)[len(score)%m::m])*m
- 내 풀이를 한 줄로 줄이면 이렇게 되는 거네...ㄷㄷ
- 미친 듯