728x90
반응형
https://www.acmicpc.net/problem/18185
18185번: 라면 사기 (Small)
라면매니아 교준이네 집 주변에는 N개의 라면 공장이 있다. 각 공장은 1번부터 N번까지 차례대로 번호가 부여되어 있다. 교준이는 i번 공장에서 정확하게 Ai개의 라면을 구매하고자 한다(1 ≤ i
www.acmicpc.net
문제 해결
- 단순히 3개를 많이 사고 2개 1개를 사면 좋을거라 생각하기 쉽다.
- 하지만 j, j+1, j+2 공장 라면이 만약 3 5 2 로 있다고 생각해보자.
- 3개를 먼저 사면 7*2 + 5*1 + 3*2 = 25일 것이다.
- j+1,j+2공장 차이만큼 j와 j+1공장에서 라면을 먼저 사도 5*3 + 5*2 = 25이다.
- 하지만 j+3 고장에 만약 2개가 있다면?
- 3개를 먼저 사는 전략이면 7*2 + 5*1 + 3*2 + 3*2 = 31 이다. (계산해보면 알겠지만 다음거에서 할인을 못받는다.)
- 하지만 j+1,j+2공장 차이만큼 j와 j+1공장에서 라면을 먼저 사면 5*3+7*2 = 29로 더 싸다.
- 즉 다음거를 생각하면 j+1과 j+2공장의 차이와 j공장 중 최솟값만큼 2개 묶음을 먼저 사는 것이 더 좋다는 것이다.
- 직접 다음 공장의 라면을 고려하며 생각하지 않으면 생각하기 힘든 문제라고 생각한다.
CODE
import sys
input = sys.stdin.readline
def buy_three(i):
global answer
k = min(A[i:i+3])
A[i], A[i+1], A[i+2] = A[i]-k, A[i+1]-k, A[i+2]-k
answer += 7*k
def buy_two(i):
global answer
k = min(A[i:i+2])
A[i], A[i+1] = A[i]-k, A[i+1] -k
answer += 5*k
def buy_one(i):
global answer
answer += 3*A[i]
if __name__=='__main__':
n = int(input())
A = list(map(int, input().split())) + [0,0] # for문으로 한번에 돌리기 위해서
answer = 0
for j in range(n):
if A[j+1] > A[j+2]:
k = min(A[j],A[j+1]-A[j+2])
A[j], A[j+1] = A[j] - k, A[j+1] - k
answer += 5*k
buy_three(j)
else:
buy_three(j)
buy_two(j)
buy_one(j)
print(answer)
728x90
반응형
'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글
[python] 백준 13460 구슬 탈출 2 (0) | 2023.04.30 |
---|---|
[python] 백준 17281 야구 (0) | 2023.04.30 |
[python] 백준 4716 풍선 (1) | 2023.04.28 |
[python] 백준 6593 상범 빌딩 (0) | 2023.04.26 |
[python] 백준 17471 게리맨더링 (0) | 2023.04.26 |
댓글