본문 바로가기
백준 & 프로그래머스

프로그래머스. 광물 캐기. python

by concho 2023. 12. 17.
def solution(picks, minerals):
    answer, mining = 0, {"diamond":[1,5,25], "iron":[1,1,5], "stone":[1,1,1]}
    mineral_group_fatigue, minerals_len, extra_fatigue = [], len(minerals), []
    minable = sum(picks) * 5
    #print(minable)
    minable_cnt = 0
    # n번 group을 dia, iron, stone곡괭이로 채굴했을 때의 fatigue(피로도) 저장
    fatigue = [0,0,0]
    for i,mineral in enumerate(minerals, start = 1):
        minable_cnt += 1
        if minable_cnt > minable: break
        fatigue[0] += mining[mineral][0]
        fatigue[1] += mining[mineral][1]
        fatigue[2] += mining[mineral][2]
        if i % 5 == 0:
            mineral_group_fatigue.append(fatigue)
            fatigue = [0,0,0]
        elif i == minerals_len:
            extra_fatigue = fatigue
    if len(extra_fatigue) != 0:
        mineral_group_fatigue.append(extra_fatigue)
    mineral_group_fatigue.sort(key=lambda x:x[2])
    #print(mineral_group_fatigue, extra_fatigue)
    # 각 곡괭이에 해당하는 각 광물의 피로도가 5배 이하인 것을 보니 ex) 1*5 <= 5, 5*5 <= 25
    # 피로도가 높은 그룹을 좋은 곡괭이로 캐는것이 sol
    for _ in range(picks[0]):
        if len(mineral_group_fatigue) == 0: break
        else:
            picks[0] -= 1
            answer += mineral_group_fatigue.pop()[0]
    for _ in range(picks[1]):
        if len(mineral_group_fatigue) == 0: break
        else:
            picks[1] -= 1
            answer += mineral_group_fatigue.pop()[1]
    for _ in range(picks[2]):
        if len(mineral_group_fatigue) == 0: break
        else:
            picks[2] -= 1
            answer += mineral_group_fatigue.pop()[2]

    return answer

댓글