코딩테스트/프로그래머스

[프로그래머스][구현] 광물 캐기

박소민 2024. 11. 27. 00:35
광물 캐기
 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

  • 풀이
    • 한 곡괭이로 5개의 광물을 연속으로 깨야하기 때문에 5개씩 묶음
      • 광물이 최대 50개 이므로 5개씩 묶으면 10개의 group이 생성됨
      • 각 그룹마다 dia,iron,stone의 갯수를 셈
    • dia, iron, stone이 많은 순서대로 정렬
      • dia, iron, stone 순으로 곡괭이를 사용할 것이기 때문
    • 곡괭이 수를 줄여나가면서 각 그룹에서의 피로도 계산
def solution(picks, minerals):
    # 사용할 수 있는 최대 광물 수
    max_minerals = sum(picks) * 5
    minerals = minerals[:max_minerals]  # 캘 수 있는 만큼만 자르기

    # 광물 5개씩 묶어서 카운트
    groups = [[0, 0, 0] for _ in range(10)]
    for i, mineral in enumerate(minerals):
        if mineral == 'diamond':
            groups[i // 5][0] += 1
        elif mineral == 'iron':
            groups[i // 5][1] += 1
        else:
            groups[i // 5][2] += 1

    # 피로도가 높은 순으로 정렬
    groups.sort(key=lambda x: (-x[0], -x[1], -x[2]))

    # 피로도 계산
    answer = 0
    for group in groups:
        d, i, s = group
        if picks[0] > 0:  # 다이아 곡괭이
            picks[0] -= 1
            answer += d + i + s
        elif picks[1] > 0:  # 철 곡괭이
            picks[1] -= 1
            answer += 5 * d + i + s
        elif picks[2] > 0:  # 돌 곡괭이
            picks[2] -= 1
            answer += 25 * d + 5 * i + s

    return answer