Python/알고리즘 문제 풀이

[코테] 과일 장수

마이구미+ 2023. 5. 19. 15:39

<로직 고민>

  • 음 뭔가...점수가 제일 높은 순대로 조합해서 상자를 빼서 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
  • 내 풀이를 한 줄로 줄이면 이렇게 되는 거네...ㄷㄷ
  • 미친 듯