새소식

⌨️ Algorithms/프로그래머스

[Python] 프로그래머스 Lv1_과일 장수

2022. 12. 28. 22:45

  • -

https://school.programmers.co.kr/learn/courses/30/lessons/135808

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

  • 사과는 상태에 따라 1점부터 k점까지의 점수로 분류 (k점이 최상품, 1점이 최하품)
  • 사과 한 상자의 가격은 다음과 같이 결정
    • 한 상자에 사과를 m개씩 담아 포장
    • 상자에 담긴 사과 중 가장 낮은 점수가 p (1 ≤ p ≤ k)점인 경우, 사과 한 상자의 가격은 p * m
  • 과일 장수가 가능한 많은 사과를 팔았을 때, 얻을 수 있는 최대 이익을 계산
  • 사과는 상자 단위로만 판매하며, 남는 사과는 버림
  • k: 사과의 최대 점수
  • m: 한 상자에 들어가는 사과의 수
  • score: 사과들의 점수
  • 과일 장수가 얻을 수 있는 최대 이익을 return

제한사항

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

 

"""
입출력 예시)

k = 3, m = 4, score = [1, 2, 3, 1, 2, 3, 1] -> 8
k = 4, m = 3, score = [4, 1, 2, 2, 4, 4, 4, 4, 1, 2, 4, 2] -> 33
"""

 

# k = 3, m = 4, score = [1, 2, 3, 1, 2, 3, 1] -> 8

# [2, 3, 2, 3]으로 구성된 사과 상자 1개를 만들어 판매하여 최대 이익을 얻을 수 있음
# (최저 사과 점수) x (한 상자에 담긴 사과 개수) x (상자의 개수) = 2 x 4 x 1 
# => 8
# k = 4, m = 3, score = [4, 1, 2, 2, 4, 4, 4, 4, 1, 2, 4, 2] -> 33

# 상자: [1, 1, 2] -> 가격: 1 x 3 = 3
# 상자: [2, 2, 2] -> 가격: 2 x 3 = 6
# 상자: [4, 4, 4] -> 가격: 4 x 3 = 12
# 상자: [4, 4, 4] -> 가격: 4 x 3 = 12

# => (1 x 3 x 1) + (2 x 3 x 1) + (4 x 3 x 2) = 33

 

 

## 의사코드 ##

# m개 만큼의 사과를 나눔
# 가격은 상자에 담긴 사과 중 가장 낮은 점수 x m

# score를 내림차순 정렬해서 점수가 높은 사과들부터 정렬
# 정렬된 score 리스트를 m개씩 나눔
# 가장 낮은 점수 x m x 상자 개수 -> answer += (가장 낮은 점수 x m) 으로 하면 상자 개수 곱할 필요 없음

 

 

통과한 코드

 

def solution(k, m, score):
    answer = 0
    # 점수가 높은 사과부터 내림차순 정렬
    s = sorted(score, reverse=True)
    for i in range(0, len(s), m): # i => 0부터 len(s)-1 까지 m씩 출력
        box = s[i:i+m] # 점수가 높은 사과부터 한 상자에 m개씩 나눠 담음
        # 한 상자의 가격 계산
        if len(box) == m: # 사과가 m개씩 담긴 상자인 경우만 
            answer += min(box) * m # 상자의 사과 중 가장 낮은 점수 x m
    return answer

 

-> 얻을 수 있는 최대 이익을 계산해야 하기 때문에 먼저 score를 점수가 높은 사과부터 내림차순으로 정렬하고, for문의 범위를 m개씩 구성

 

 

  • range의 증가폭을 지정해서 해당 값만큼 숫자 증가시키기
    • for 변수 in range(시작, 끝, 증가폭) 
# 0 ~ 11까지 3씩 증가해서 출력
for i in range(0, 12, 3):
    print(i)
    
"""
0
3
6
9
"""

 

 

  • 통과한 코드 과정 확인
# k = 4, m = 3, score = [4, 1, 2, 2, 4, 4, 4, 4, 1, 2, 4, 2]

"""
sorted score: [4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 1, 1] 

box: [4, 4, 4]
box: [4, 4, 4]
box: [2, 2, 2]
box: [2, 1, 1]

answer = 33
"""


# k = 3, m = 4, score = [1, 2, 3, 1, 2, 3, 1]

"""
sorted score: [3, 3, 2, 2, 1, 1, 1] 

box: [3, 3, 2, 2]
box: [1, 1, 1]

answer = 8
"""

 

 

참고) 

https://honeynyancat.tistory.com/56

 

[프로그래머스] LV.1 과일 장수 / 파이썬(Python)

📜 문제 설명 과일 장수가 사과 상자를 포장하고 있습니다. 사과는 상태에 따라 1점부터 k점까지의 점수로 분류하며, k점이 최상품의 사과이고 1점이 최하품의 사과입니다. 사과 한 상자의 가격

honeynyancat.tistory.com

 

https://dojang.io/mod/page/view.php?id=2242

 

파이썬 코딩 도장: 16.2 for와 range 응용하기

'10.1 리스트 만들기'에서 range에 시작하는 숫자와 끝나는 숫자를 지정하거나, 증가폭을 지정하는 방법을 배웠죠? 이번에는 range의 다양한 기능을 활용하여 for 반복문을 사용해보겠습니다. 16.2.1 

dojang.io

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다!