본문 바로가기
프로그래머스/2단계

(Python/LV2)광물캐기

by windy7271 2023. 4. 4.
728x90
반응형

문제출처: https://school.programmers.co.kr/learn/courses/30/lessons/172927?language=python3 

풀이:

 

def solution(picks, minerals):
    answer = 0

#	스톤으로 캤을때 베이스
    Stone_Base = [25 if i == "diamond" else 5 if i == "iron" else 1 for i in minerals[:5*sum(picks)]]

#	5개씩 분류하기
	div_5 = [Stone_Base[5*i:5*(i+1)] for i in range((len(Stone_Base)-1)//5+1)]


    div_5 = sorted(div_5 , key = lambda x : sum(x),reverse=True )
    print(div_5)
    for i in range(len(picks)):
        while ( picks[i] !=0 and len(div_5) !=0 ) :
            if i == 0 :
                answer += len(div_5[0])
            elif i == 1:
                for j in div_5[0]:
                    if j == 1:
                        answer += 1
                    else :
                        answer += j//5
            else:
                answer += sum(div_5[0])
            picks[i] -= 1
            div_5.pop(0)
    return answer

print(solution([1, 3, 2], ["diamond", "diamond", "diamond", "iron", "iron", "diamond", "iron", "stone","stone"]))

 

문제의 중요 포인트는 곡괭이의 순서는 바꿀 수 있지만, 광물의 순서를 바꿀 수 없다, 순서대로 5개씩은 무조건 가져야한다.

Stone_Base = [25 if i == "diamond" else 5 if i == "iron" else 1 for i in minerals[:5*sum(picks)]]

위 아래 코드 동일

 for i in minerals[:5*sum(picks)]:
         if i == "diamond":
             Stone_Base.append(25)
         elif i =="iron" :
             Stone_Base.append(5)
         else :
             Stone_Base.append(1)
             
무조건 스톤 곡괭이로캤을때로 계산을 하였다.
곡괭이 1개당 5개광물을 캘수있으므로 5*sum(picks) 을 해줘야한다.

 

# 5개씩 끊어읽음
div_5 = []
for i in range(len(Stone_Base)//5+1) :
	div_5.append(Stone_Base[5*i:5*(i+1)])


div_5 = [Stone_Base[5*i:5*(i+1)] for i in range((len(Stone_Base)-1)//5+1)]

5개씩 끊어서 div_5 에 저장한다.

 

 

div_5 = sorted(div_5 , key = lambda x : sum(x),reverse=True )

그리고 5개씩 끊은 것들의 합을 구해 내림차순한다. 왜냐면 가장 많은 점수일수록, 좋은 곡괭이로 부셔야 하기 때문이다.

 

이제 곡괭이 별로 점수를 바꿔줘야한다.

 

 

for i in range(len(picks)):
    while ( picks[i] !=0 and len(div_5) !=0 ) :
        if i == 0 :
            answer += len(div_5[0])
        elif i == 1:
            for j in div_5[0]:
                if j == 1:
                    answer += 1
                else :
                    answer += j//5
        else:
            answer += sum(div_5[0])
        picks[i] -= 1
        div_5.pop(0)
return answer

첫 번째 포문을 돌리면 0,1,2 가 나온다 (다이아곡괭, 아이언곡괭,돌곡괭 )

picks 가 = [1, 3, 2] 이면 다이아곡괭은 1 개가 있기 때문에

 

어느 광물이든 1점이기때문에 개당 1점이니깐 5개씪 나눈것 중에서 가장 많은 점수가 필요로 하는 무리의 길이만큼 가져온다. 

생각없이 그냥 5를 더하면 광물을 4개를 캘 경우에도 5개를 더하므로 len(div_5[0])으로 해준다.

 

그리고 다이아 곡괭이를 썼으니깐, picks[i] 에 1개를 빼주고, 5개무리도 한 번 사용했으니 pop 혹은 del 을해준다.

 

그 다음 아이언곡괭으로 할때는 25,5,1 점이 5 ,1,1 이다 즉 1점 빼고는 5를 나누어서 더해줘야 하므로 저런 식이나온다.

 

그리고 돌 곡괭이 일때는 처음에 돌 곡괭이로 계산했으니 그대로 더해주면 된다.

 

 

 

 
반응형

댓글