[programmers/py] 광물 캐기

승민·2023년 11월 1일

알고리즘

목록 보기
41/171
post-thumbnail

광물 캐기

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

문제 설명

마인은 다이아몬드 곡괭이, 철 곡괭이, 돌 곡괭이를 각각 0개에서 5개까지 가지고 있으며, 곡괭이로 광물을 캘 때는 피로도가 소모됩니다.

소모 피로도

각 곡괭이는 종류에 상관없이 광물 5개를 캔 후에는 더 이상 사용할 수 없습니다.

마인이 갖고 있는 곡괭이의 개수를 나타내는 정수 배열 picks와 광물들의 순서를 나타내는 문자열 배열 minerals가 매개변수로 주어질 때, 마인이 작업을 끝내기까지 필요한 최소한의 피로도를 return 하는 solution 함수를 완성해주세요.

문제 조건

  • 사용할 수 있는 곡괭이중 아무거나 하나를 선택해 광물을 캡니다.
  • 한 번 사용하기 시작한 곡괭이는 사용할 수 없을 때까지 사용합니다. (max=5)
  • 광물은 주어진 순서대로만 캘 수 있습니다.
  • 광산에 있는 모든 광물을 캐거나, 더 사용할 곡괭이가 없을 때까지 광물을 캡니다.

문제 핵심

  1. minerals과 picks 중 먼서 서모되는 것을 기준으로 minerals를 잘라줌
  2. minerals를 5개씩 잘라 각 곡괭이마다 피로도를 계산
  3. 돌 곡괭이 피로도가 클수록 다이아가 많다 => 돌,철,다이아 순으로 내림차순 정렬
  4. 다이아 곡괭이부터 사용해 최소 피로도를 계산한다.
def solution(picks, minerals):
    # 곡괭이 없으면 0
    if sum(picks) == 0 :
        return 0
    # 최대 캘 수 있는 광물 수
    # 곡괭이가 부족하면 잘리고, 남으면 전부 다 캔다.
    minerals = minerals[0:sum(picks)*5]

    # 한 번에 5번씩 잘라서 각 d,i,s마다 소모 피로도 계산
    count = []
    for i in range(0, len(minerals), 5):
        l = minerals[i:i+5]
        di = len(l)
        ir = l.count("diamond")*5 + l.count("iron") + l.count("stone")
        st = l.count("diamond")*25 + l.count("iron")*5 + l.count("stone")
        count.append([di, ir, st])
                     
    answer = 0
    count.sort(key=lambda x: (-x[2], -x[1], -x[0]))
    for c in count:
        if picks[0] > 0:
            answer += c[0]
            picks[0] -= 1
            
        elif picks[1] > 0:
            answer += c[1]
            picks[1] -=1
            
        elif picks[2] > 0:
            answer += c[2]
            picks[2] -= 1
        
    # 최소 필요도
    return answer
변수 명을 잘 보자, 변수 명 잘못써서 40분 소모

0개의 댓글