JasonScript

Jason's Research Blog

Development/Algorithm

< 알고리즘 문제 풀이 > 광물 캐기

jason.bak 2023. 12. 5. 20:15

문제 링크 > 코딩테스트 연습 - 광물 캐기 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

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

programmers.co.kr

 

솔루션 >

def solution(picks, minerals):
    answer = 0
    num = {'diamond': 0, 'iron': 1, 'stone': 2}
    # 각 곡괭이로 광물을 캘 때의 피로도
    fatigue = [[1, 1, 1], 
               [5, 1, 1], 
               [25, 5, 1]]
    # 캘 수 있는 해당 개수까지 슬라이싱
    minerals = minerals[:5 * sum(picks)]

    # 각 광물의 수 체크
    check = []

    idx = 0
    cnt = 1
    temp = [0, 0, 0]
    while idx < len(minerals):
        # 하나의 곡괭이로 캘수 있는 광물을 다 채웠다면 각 변수들 초기화
        if cnt > 5:
            check.append(temp)
            cnt = 1
            temp = [0, 0, 0]

        temp[num[minerals[idx]]] += 1
        cnt += 1
        idx += 1

    if temp:
        check.append(temp)
        
    # 다이아몬드, 철, 돌이 많은 순으로 정렬
    check.sort(key=lambda x: (x[2], x[1], x[0]))

    # pick 순서대로 해당 곡괭이 개수만큼 곡괭이 번호
    pick = []
    for i in range(3):
        pick += [i] * picks[i]

    p = 0
    for i in range(len(check)):
        for j in range(len(num)):
            # 하나의 곡괭이를 소진했을 때 발생하는 피로도 누적
            answer += fatigue[pick[p]][j] * check[i][j]
        p += 1

    return answer