출처 : 프로그래머스

문제는 여기에


문제

  • 사과는 상태에 따라 1점부터 k점까지의 점수로 분류한다. (k점 = 최상품 사과, 1점 = 최하품 사과)
  • 한 상자에 사과를 m개씩 담아 포장한다.
  • 상자에 담긴 사과 중 가장 낮은 점수가 p점인 경우, 사과 한 상자의 가격은 p * m 이다. (1<= p<= k)
  • 즉, (최저 사과 점수) X (한 상자에 담긴 사과 개수) X (상자의 개수)
  • 사과는 상자 단위로만 판매하며, 남는 사과는 버린다.
  • 사과의 최대 점수 k, 한 상자에 들어가는 사과의 수 m, 사과들의 점수 score 가 주어졌을 때, 과일 장수가 얻을 수 있는 최대 이익을 return하는 solution 함수를 완성해라

제한사항

  • 3 <= k <= 9
  • 3 <= m <= 10
  • 7 <= score 의 길이 <= 1,000,000
    • 1<= score[i] <= k
  • 이익이 발생하지 않는 경우에는 0을 return

입출력 예

접근

1. list 하나를 더 선언하고, score 에서 가장 큰 점수를 list에 추가하고(append), score에서는 삭제하자(remove)

2. list의 원소가 m가 같아질 경우, 이익을 계산

3. 계산 후 (남은 score의 원소의 개수를 m으로 나눈 몫) <= 0 이면 이익을 return한다.

4. (3)에서 나눈 몫이 >= 0 이면, list를 초기화하고, 다시 (1) 반복

 

= > 시간초과 ㅠㅠ

def solution(k, m, score):
    answer = 0
    list = []
    for i in range(len(score)):
        list.append(max(score))
        score.remove(max(score))
        if len(list) == m:
            answer += min(list) * m
            if (len(score) // m) <= 0:
                return answer
            else: 
                del list[:]

고찰

위의 코드를 작성할 때 새로운 리스트를 하나 더 만들어야하나 싶긴했다.

내가 간과했던 것이 있다면, range의 3번째 인자는 증감을 나타낼 수 있다는 것이다.

원래 주어진 score 를 내림차순으로 정렬하자. (내림차순으로 정렬하면 내려 갈수록(뒤로 갈수록) 작아진다.)

코드

def solution(k, m, score):
    answer = 0
    score = sorted(score, reverse = True)

    for i in range(0, len(score), m):
        tmp = score[i:i+m]

        if len(tmp) == m:
            answer += min(tmp) * m

    return answer

성공이다 ^^

성공하자마자 다른 사람의 풀이를 봤는데

ㅎ.......

 

다른 사람의 코드

def solution(k, m, score):
    return sum(sorted(score)[len(score)%m::m])*m

아찔하다. . .