[알고리즘 문제 풀이][파이썬] 프로그래머스: 광물캐기

염지현·2023년 4월 5일
2
post-thumbnail

프로그래머스 광물캐기 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/172927?language=python3

📑 문제 설명
1. 다이아몬드, 철, 돌로 만들어진 곡괭이가 있음
2. 각 곡괭이로 다이아몬드, 철, 돌을 캘 수 있음
3. 곡괭이별로 광물을 캘 때 피로도는 위 표와 같음
4. 곡괭이와 광물이 주어졌을 때 최소의 피로도를 출력

입력: 각 곡괭이 별 수, 광물 리스트
출력: 최소한의 피로도

💡 문제 해결 방법
알고리즘: 구현

  1. 곡괭이는 랜덤하게 사용할 수 있으나, 광물을 순서대로 5개씩 캐야 함.
  2. 연속으로 5개를 캐야하기 때문에 5개씩 광물을 묶은 후 dia, iron, stone 개수 count
  3. 2번에서 카운트한 광물 리스트를 dia, iron, stone 순서대로 정렬
  4. 3번 결과 돌 곡괭이 기준 피로도가 높은 광물 순서대로 정렬이 되기 때문에 피로도가 가장 낮은 다이아몬드, 철, 돌 곡괭이 순서대로 사용하여 피로도 계산

예외처리 및 추가 내용
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

💟 추가적으로 알게 된 점

참고

0개의 댓글