Coding Test/programmers

[Python] 파이썬 프로그래머스 광물 캐기

파송송 2023. 4. 3. 21:23
728x90

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

 

프로그래머스

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

programmers.co.kr


나의 풀이

피로도

  • 곡괭이로 광물을 캘 때 피로도가 가장 작을 때를 반환해야 함
  • 사용할 수 있는 곡괭이 중 아무거나 하나를 선택해서 사용함
  • 한 번 사용한 곡괭이는 5번을 다 캐야지 바꿀 수 있음
  • 광물은 주어진 순서대로만 캐야 함
  • 광물을 다 캐거나 곡괭이를 다 소모할 때까지 광물을 캐야 함

 

  1. minerals를 minerals[:(sum(picks))*5]로 줄여 곡괭이의 수만큼 광물을 캘 수 있게 한다.
  2. minerals을 5씩 나눠 diamond, iron, stone의 개수만큼 list에 넣는다.
  3. diamond, iron 순으로 정렬한다.

다음과 같이 정리하고 곡괭이 다이아 -> 철 -> 돌 순으로 피로도를 구하면 이것이 최소가 된다.

def solution(picks, minerals):
    answer = 0
    minerals_cnt = []
    minerals = minerals[:(sum(picks))*5]

    for i in range(len(minerals)//5+1):
        dia, iron, stone = minerals[i*5:i*5+5].count('diamond'),minerals[i*5:i*5+5].count('iron'),minerals[i*5:i*5+5].count('stone')
        minerals_cnt.append([dia, iron, stone])
    minerals_cnt.sort(key=lambda x:(x[0],x[1]), reverse= True)


    for i, p in enumerate(picks):
        for j in range(p):
            mi = minerals_cnt.pop(0)
            if i == 0:
                answer += mi[0]
                answer += mi[1]
                answer += mi[2]
            elif i == 1:
                answer += mi[0]*5
                answer += mi[1]
                answer += mi[2]
            elif i == 2:
                answer += mi[0]*25
                answer += mi[1]*5
                answer += mi[2]
            if minerals_cnt == []:
                return  answer

    return answer

728x90