본문 바로가기
백준알고리즘/그리디 알고리즘

(Python/다이아4)백준알고리즘 14186번: 라면 사기(Large)

by windy7271 2024. 10. 18.
728x90
반응형

 

문제 바로가기 

문제:

라면매니아 교준이네 집 주변에는 N개의 라면 공장이 있다. 각 공장은 1번부터 N번까지 차례대로 번호가 부여되어 있다. 교준이는 i번 공장에서 정확하게 Ai개의 라면을 구매하고자 한다(1 ≤ i ≤ N).

교준이는 아래의 세 가지 방법으로 라면을 구매할 수 있다.

  1. i번 공장에서 라면을 하나 구매한다(1 ≤ i ≤ N). 이 경우 비용은 B원이 든다.
  2. i번 공장과 (i+1)번 공장에서 각각 라면을 하나씩 구매한다(1 ≤ i ≤ N-1). 이 경우 비용은 (B+C)원이 든다.
  3. i번 공장과 (i+1)번 공장, (i+2)번 공장에서 각각 라면을 하나씩 구매한다(1 ≤ i ≤ N-2). 이 경우 비용은 (B+2C)원이 든다.

최소의 비용으로 라면을 구매하고자 할 때, 교준이가 필요한 금액을 출력하는 프로그램을 작성하시오.

 

입력:

첫 번째 줄에 라면 공장의 개수를 의미하는 자연수 N과 두 자연수 B, C가 사이에 공백을 두고 주어진다. 두번째 줄에 N개의 정수 A1, ···, AN가 사이에 공백을 두고 주어진다.

출력:

첫 번째 줄에 교준이가 필요한 최소 금액을 출력한다.

 

풀이:

import sys

sys.stdin = open('/Users/song/Desktop/Python/Python/h.txt', 'r')

n, b, c = map(int, sys.stdin.readline().rstrip().split())
arr = list(map(int, sys.stdin.readline().rstrip().split())) + [0, 0]
rst = 0


def number1(i):
    global rst
    rst += b * arr[i]


def number2(i):
    global rst

    buy = min(arr[i], arr[i + 1])
    rst += (b + c) * buy
    arr[i] -= buy
    arr[i + 1] -= buy


def number3(i):
    global rst
    buy = min(arr[i], arr[i + 1], arr[i + 2])
    rst += (b + (2 * c)) * buy
    arr[i] -= buy
    arr[i + 1] -= buy
    arr[i + 2] -= buy


if b <= c:
    rst = b * sum(arr)
else:
    for i in range(len(arr) - 2):

        if arr[i + 1] > arr[i + 2]:
            buy = min(arr[i], arr[i + 1] - arr[i + 2])

            rst += (b + c) * buy
            arr[i] -= buy
            arr[i + 1] -= buy

            number3(i)
            number1(i)
        else:

            number3(i)
            number2(i)
            number1(i)

print(rst)

 

이 전문제와 똑같은데

 

만약 b = 1 c= 4 일경우 그냥 b로 다 구매하면 되기때문에 그거 처리를 해주고

 

b = 2 c = 1일경우 

 

이렇게 되면 1 칸살때 2, 2칸 살때는 3(1칸으로는 4), 3칸살때 4 (1칸으로사면 6) 이므로 이 전 문제와 똑같이 진행해주면 된다.

 

코드가 복잡해서 함수형으로 바꿔줬다.

 

 

 

반응형

댓글