본문 바로가기
코딩 테스트 연습

[알고리즘] 프로그래머스 - 과일 장수

by 코드뭉치 2023. 5. 19.

과일 장수

 

프로그래머스

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

programmers.co.kr

 

1. 구해야 하는 것
    각각의 상자 가격들의 합이 최대일때의 이익
2. 1을 구하기 위해 필요한 것
    최대가 되려면? 최저가의 사과들끼리, 품질 좋은 사과끼리 분리해야함
        sort로 정렬 후 m개 씩 끊어서 담기
            개수가 모자라면 세지 않음

 

 

내림차순으로 정렬 후 0부터 사과개수 -1까지  m개의 step으로 for문 돌리기

i:i+m개씩 슬라이싱했을 때, len(a)가 m개, 즉 한 상자를 모두 채운다면, result에 해당 상자 가격을 더해준다

def solution(k, m, score):
    result = 0
    score.sort(reverse=True)
    for i in range(0, len(score), m):
        a = score[i:i+m]
        if len(a) == m:
            result += min(a)*m
    return result

 

 

다른 풀이

오름차순 정렬 후 (총 사과개수를 상자당 사과개수 로 나눈 나머지) 부터 시작해서 m개씩 자른다 

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

 

# 코드 뽀개기
a = len(score) % m  # (사과 개수)를 (한 상자당 사과 개수)로 나눈 나머지 = 버려야 할 부분!!
b = sorted(score)  # 사과를 품질별 오름차순 정렬
c = b[a::m]  # 사과를 품질별 오름차순 정렬한 리스트를 필요없는 부분 제끼고 m개씩 나누기
# 오름차순 정렬이므로 m개씩 나누면 첫번째 원소가 최솟값이 된다.
d = sum(c)  # sum으로 상자별 최소 사과가격을 모두 더함

return d*m  # 상자개수를 곱해서 총 수익 구하기

 

 

오름차순 정렬한 score와 m개씩 슬라이싱한 리스트

 

댓글