본문 바로가기
프로그래밍/Baekjoon & Codeup

[백준] 18185번 라면 사기(Small) 문제풀이

by Homo_Viator 2023. 8. 17.

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

 

18185번: 라면 사기 (Small)

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

www.acmicpc.net

 

문제

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

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

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

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

 

아이디어

예시와 함께 알아보도록 하겠습니다.

 

a2와 a3에 인수를 넣는 조건을 알았으니 다시 문제로 돌아가겠습니다.

 

소스코드

 

#include <iostream>
#define MAX 10001
using namespace std;

int origin_three[MAX], compare_five[MAX],compare_seven[MAX];
int minPrice, numOfFactory;

int getMinimum(int a, int b){
    if(a <= b) return a;
    else return b;
}

void getInput(){
    scanf("%d",&numOfFactory);
    for(int i=1; i<=numOfFactory; i++){
        scanf("%d", &origin_three[i]);
    }
}

void getMinprice(){
    for(int i=1; i<=numOfFactory; i++) {
        minPrice += (origin_three[i] * 3 + compare_five[i] * 5 + compare_seven[i] * 7);
    }
}

void getMethod(){
    for(int i=1; i<=numOfFactory; i++)
    {
        compare_five[i] = getMinimum(origin_three[i], origin_three[i-1]);
        origin_three[i] = origin_three[i] - compare_five[i];
        origin_three[i-1] = origin_three[i-1] - compare_five[i];

        compare_seven[i] = getMinimum(origin_three[i], compare_five[i-1]);
        origin_three[i] = origin_three[i] - compare_seven[i];
        compare_five[i-1] = compare_five[i-1] - compare_seven[i];
    }
}

void Print(){
   printf("%d", minPrice);
}

int main()
{
    getInput();
    getMethod();
    getMinprice();
    Print();
    return 0;
}

 

728x90