BaekJoon(18185) 라면 사기 (small)
라면 사기 (Small)
| 시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
|---|---|---|---|---|---|
| 0.5 초 (추가 시간 없음) | 32 MB | 7012 | 1729 | 1390 | 30.323% |
문제
라면매니아 교준이네 집 주변에는 N개의 라면 공장이 있다. 각 공장은 1번부터 N번까지 차례대로 번호가 부여되어 있다. 교준이는 i번 공장에서 정확하게 Ai개의 라면을 구매하고자 한다(1 ≤ i ≤ N).
교준이는 아래의 세 가지 방법으로 라면을 구매할 수 있다.
- i번 공장에서 라면을 하나 구매한다(1 ≤ i ≤ N). 이 경우 비용은 3원이 든다.
- i번 공장과 (i+1)번 공장에서 각각 라면을 하나씩 구매한다(1 ≤ i ≤ N1). 이 경우 비용은 5원이 든다.
- i번 공장과 (i+1)번 공장, (i+2)번 공장에서 각각 라면을 하나씩 구매한다(1 ≤ i ≤ N2). 이 경우 비용은 7원이 든다.
최소의 비용으로 라면을 구매하고자 할 때, 교준이가 필요한 금액을 출력하는 프로그램을 작성하시오.
입력
첫 번째 줄에 라면 공장의 개수를 의미하는 자연수 N가 주어진다.
두번째 줄에 N개의 정수 A1, ···, AN가 사이에 공백을 두고 주어진다.
출력
첫 번째 줄에 교준이가 필요한 최소 금액을 출력한다.
제한
모든 입력 데이터는 다음 조건을 만족한다.
- 3 ≤ N ≤ 10000
- 0 ≤ Ai ≤ 10000 (1 ≤ i ≤ N)
예제 입력 1
3
1 0 1
예제 출력 1
6
예제 입력 2
5
1 1 1 0 2
예제 출력 2
13
코드
import sys
input = sys.stdin.readline
num = int(input())
numlist = list(map(int, input().split())) + [0, 0]
cost = 0
def buy_one(ind):
global cost
cost += 3 * numlist[ind]
def buy_two(ind):
global cost
k = min(numlist[ind: ind+2])
numlist[ind] -= k
numlist[ind+1] -= k
cost += 5 * k
def buy_three(ind):
global cost
k = min(numlist[ind: ind+3])
numlist[ind] -= k
numlist[ind+1] -= k
numlist[ind+2] -= k
cost += 7 * k
for i in range(num):
if numlist[i+1] > numlist[i+2]:
k = min(numlist[i], numlist[i+1] - numlist[i+2])
numlist[i] -= k
numlist[i+1] -= k
cost += 5 * k
buy_three(i)
else:
buy_three(i)
buy_two(i)
buy_one(i)
print(cost)