프로그래머스 광물캐기 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/172927?language=python3
📑 문제 설명
1. 다이아몬드, 철, 돌로 만들어진 곡괭이가 있음
2. 각 곡괭이로 다이아몬드, 철, 돌을 캘 수 있음
3. 곡괭이별로 광물을 캘 때 피로도는 위 표와 같음
4. 곡괭이와 광물이 주어졌을 때 최소의 피로도를 출력
입력: 각 곡괭이 별 수, 광물 리스트
출력: 최소한의 피로도
💡 문제 해결 방법
알고리즘: 구현
예외처리 및 추가 내용
1. 리스트를 정렬하는 코드로, 다중 조건을 줄 때는 다음과 같이 작성하면 됨. 이 때, - 기호는 내림차순을 의미함.
sorted(cnt_min, key = lambda x: (-x[0], -x[1], -x[2]))
💻 코드
def solution(picks, minerals):
sum = 0
for x in picks:
sum += x
# 캘 수 있는 광물의 개수
num_min = sum * 5
if len(minerals) > num_min: # 주어진 광물이 캘 수 있는 광물 수보다 크면
minerals = minerals[:num_min]
# 광물 조사
cnt_min = [[0, 0, 0]for x in range(10)] # dia, iron, stone
for i in range(len(minerals)):
if minerals[i] == 'diamond':
cnt_min[i//5][0] += 1
elif minerals[i] == 'iron':
cnt_min[i//5][1] += 1
else :
cnt_min[i//5][2] += 1
# 피로도가 높은 순서대로 광물 정렬
sorted_cnt_min = sorted(cnt_min, key = lambda x: (-x[0], -x[1], -x[2]))
# 피로도 계산
answer = 0
for mineral in sorted_cnt_min:
d, i, s = mineral
for p in range(len(picks)):
if p == 0 and picks[p]>0: # dia 곡괭이
picks[p]-=1
answer += d + i + s
break
elif p == 1 and picks[p]>0: # iron 곡괭이
picks[p]-=1
answer += 5*d + i + s
break
elif p == 2 and picks[p]>0: # stone 곡괭이
picks[p]-=1
answer += 25*d + 5*i + s
break
return answer
💟 추가적으로 알게 된 점
참고
안녕하세요, 주석을 통해서 너무 이해가 잘 되었습니다.
궁금한 점이 하나 있는데, 피로도가 높은 순서대로 정렬을 하는 이유에 대해서 알 수 있을까요?
광물을 순서대로 캐야하는데, 이유를 잘 알지 못하겠습니다.