알고리즘 연습/그리디 알고리즘

[Lv.2 / 프로그래머스 / 파이썬] 광물 캐기

김세진 2023. 4. 7. 00:04
반응형

 

 

 

 

프로그래머스

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

programmers.co.kr

 

 

풀이

 

곡괭이를 적절하게 골라 최소한의 피로도로 채광 작업을 마쳐야 한다.

앞에서부터 작업을 시작해야 하는데, 곡괭이 하나당 연속으로 5개씩 캐야 한다.

 

상위 등급의 곡괭이를 사용할 경우 최대한의 이득을 보도록 코드를 작성해야 한다.

이를 위해 곡괭이 종류별로 각 구간에 필요한 피로도를 기록하고, 하위 등급의 곡괭이를 사용할 때 필요한 피로도로 내림차순 정렬하면 가장 등급이 높은 곡괭이를 사용해야 이득이 많은 순으로 피로도 구간이 정렬된다.

 

def solution(picks, minerals):
    # minerals 리스트를 5개씩 묶어 2차원 리스트로 반환
    # 곡괭이를 모두 사용했는데 광물이 남아 있는 경우는 min 함수를 통해 제외
    minerals = [list(minerals[i:i+5]) for i in range(0, min(sum(picks)*5, len(minerals)), 5)]
    req = []
    
    # 각 묶음에서 곡괭이별로 필요한 피로도를 계산하여 반환
    for bundle in minerals:
        tmp = [0,0,0]
        
        for i in bundle:
            tmp[0] += 1
            tmp[1] += 5 if i == "diamond" else 1
            tmp[2] += 25 if i == "diamond" else 5 if i == "iron" else 1
            
        req.append(tmp)
    
    # 낮은 등급의 곡괭이 점수를 기준으로 내림차순 정렬
    req.sort(key=lambda x:(-x[2],-x[1]))
    
    # 다이아몬드 곡괭이부터 순서대로 사용
    ans = 0
    for score in req:
        if picks[0]:
            ans += score[0]
            picks[0] -= 1
        elif picks[1]:
            ans += score[1]
            picks[1] -=1
        elif picks[2]:
            ans += score[2]
            picks[2] -= 1
        else:
            break
    
    return ans

 

 

 

 

반응형