본문 바로가기

알고리즘/프로그래머스

[프로그래머스]Lv2. 광물 캐기(Python)

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

 

프로그래머스

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

programmers.co.kr

 

문제 접근

 

1. 곡괭이 1개 => 5개의 광물 캐기 가능

2. 주어진 곡괭이로 캘 수 있는 광물만큼 자르기

3. 연속해서 5개를 캐야하므로 5개씩 광물을 잘라 새로운 배열에 저장

4. 다이아  >  철  >  돌 순서대로 정렬해야 최소한의 피로도로 작업 끝내기 가능

 

코드
def solution(picks, minerals):
    answer = 0
    sum = 0
    
    # 곡괭이의 수
    for pick in picks:
        sum += pick
        
    # 주어진 곡괭이로 캘 수 있는 광물만큼 커팅 
    num = sum * 5
    if len(minerals) > sum:
        minerals = minerals[:num]
    
    # minerals의 광물들을 5개의 단위로 분류하고, 각 그룹 내에서 다이아몬드, 철, 돌의 개수를 세어 새로운 리스트에 저장 
    new_minerals = [[0, 0, 0] for _ in range(len(minerals)//5+1)]
    for i in range(len(minerals)):
        if minerals[i] == 'diamond':
            new_minerals[i//5][0] += 1
        elif minerals[i] == 'iron':
            new_minerals[i//5][1] += 1
        elif minerals[i] == 'stone':
            new_minerals[i//5][2] += 1 
        
    # 광물을 다이아몬드, 철, 돌 순서대로 정렬(핵심)
    # 광물은 무조건 5개씩 연속으로 캔다.(조건1)
    # 5개를 채굴할 때마다 곡괭이 선택 
    new_minerals.sort(key=lambda x:(-x[0], -x[1], -x[2]))
    
    for i in new_minerals:
        dia, iron, stone = i
        
        for j in range(len(picks)):
            if picks[j] > 0 and j == 0:
                picks[j] -= 1
                answer += dia + iron + stone
                break
            elif picks[j] > 0 and j == 1:
                picks[j] -= 1
                answer += 5*dia + iron + stone
                break
            elif picks[j] > 0 and j == 2:
                picks[j] -= 1
                answer += 25*dia + 5*iron + stone
                break

    return answer

 

문제 회고

 

생각보다 조건이 많은 문제였다. 특히 5개의 단위로 자른 후 또 그 안에서 다이아, 철, 돌로 나눠서 카운트하는데 이는 다이아 > 철 > 돌 순서대로 정렬하기 위한 과정이다. 그리고 이후에는 반복문을 돌면서 표에 나온 피로도를 적절하게 반영해 주는 과정만 거치면 문제는 간단하게 풀린다.