백준 18185. 라면사기(small) (Python)

Wjong·2023년 2월 22일
0

baekjoon

목록 보기
3/17

문제 : https://www.acmicpc.net/problem/18185

풀이

이게왜 다이아5..? 아는사람은 안다는 점수꿀빨기 문제이다.
기본적으로 3개구매 -> 2개구매 -> 1개구매가 가장 최소의 비용이 들지만
1 4 2 3 1 같은경우
1) idx=0에서 3개구매 -> 0 3 1 3 1 , 7원
2) idx=1에서 3개구매 -> 0 2 0 2 1 , 14원
3) idx=1에서 1개x2구매 -> 0 0 0 2 1 , 20원
4) idx=4에서 2개구매 -> 0 0 0 1 0 , 25원
5) dix=4에서 1개구매 -> 0 0 0 0 0 , 28원

1) idx=0에서 2개구매 -> 0 3 2 3 1 , 5원
2) idx=1에서 3개구매 -> 0 1 0 1 1 , 19원
3) idx=1에서 1개구매 -> 0 0 0 1 1 , 22원
4) idx=4에서 2개구매 -> 0 0 0 0 0 , 27원

위처럼 두번째지점의 갯수가 세번째지점보다 클때, 3개구매를 진행할 경우, 중간값이 혼자 동떨어져 남는 경우로 인해, 더 큰 구매비용이 발생할 수 있다. 그러므로 두번째지점이 세번째지점보다 큰 경우 2개구매 -> 3개구매 -> 1개구매를 진행해주어야함!

N=int(input())
res=0
def buythree(idx):
    global res
    k=min(li[idx:idx+3])
    for i in range(idx,idx+3):
        li[i]-=k
    res+=7*k

def buytwo(idx,type=0):
    global res
    if type==1:
        k=min(li[idx],li[idx+1]-li[idx+2])
    else:
        k=min(li[idx:idx+2])
    for i in range(idx,idx+2):
        li[i]-=k
    res+=5*k

def buyone(idx):
    global res
    k=li[idx]
    li[idx]-=k
    res+=3*k


li=[0]+list(map(int,input().split()))+[0,0]

for i in range(1,N+1):
    if li[i]!=0:
        if li[i+1]>li[i+2]:
            buytwo(i,1)
            buythree(i)
        else:
            buythree(i)
            buytwo(i)
        buyone(i)
print(res)
profile
뉴비

0개의 댓글