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를 나누어서 더해줘야 하므로 저런 식이나온다.
그리고 돌 곡괭이 일때는 처음에 돌 곡괭이로 계산했으니 그대로 더해주면 된다.
반응형
댓글