출처 : 프로그래머스
문제는 여기에
문제
- 사과는 상태에 따라 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
아찔하다. . .
'🧑💻 Coding Test > 프로그래머스' 카테고리의 다른 글
[프로그래머스 Level 1] 추억점수 (Python) (0) | 2023.09.07 |
---|---|
[프로그래머스 Level1] 삼총사 (Python) (0) | 2023.08.30 |
[프로그래머스 Level 1] 달리기 경주 (Python) (0) | 2023.08.24 |
[프로그래머스 Level 1] 크기가 작은 부분 문자열 (Python) (0) | 2023.08.22 |
[프로그래머스 Level 1] 나머지가 1이 되는 수 찾기 (Python) (0) | 2023.08.22 |