알고리즘/문제 풀이

1049: 기타줄

Themion 2021. 12. 6. 17:07

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

 

1049번: 기타줄

첫째 줄에 N과 M이 주어진다. N은 100보다 작거나 같은 자연수이고, M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 M개의 줄에는 각 브랜드의 패키지 가격과 낱개의 가격이 공백으로 구분하여 주

www.acmicpc.net

기타줄을 구매하는 방법은 세 개가 있다. 기타줄 팩만 구매하는 방법, 낱개 기타줄만 구매하는 방법, 낱개 기타줄은 5개 이하로 구매하고 나머지는 팩으로 구매하는 방법. 이 이외의 방법은 효율이 떨어지므로 이 세 방법을 모두 계산해 최솟값을 출력하면 된다.

#include <cstdio>

#define MAX 0x3f3f3f3f

int min(int a, int b) { return a < b ? a : b; }

int main()
{
    // N: 끊어진 기타줄의 수, M: 기타줄 브랜드의 수, buf: 각 가격을 입력받을 버퍼
    // pack, one: 각 브랜드의 기타줄 팩과 낱개의 최소 가격
    // price: 기타줄 팩만 사는 경우와 낱개만 사는 경우,
    //        팩으로 6개씩 산 뒤 나머지를 낱개로 사는 경우
    // ans: price의 최솟값을 저장할 공간
    int N, M, buf, pack = MAX, one = MAX, price[3], ans = MAX;

    // 끊어진 기타줄 수와 기타줄 브랜드의 수를 입력받은 뒤
    scanf("%d %d", &N, &M);
    // 각 기타줄 브랜드에 대해
    while (M--) {
        // 기타줄 팩과 낱개의 값의 최솟값을 저장
        scanf("%d", &buf);
        pack = min(pack, buf);

        scanf("%d", &buf);
        one = min(one, buf);
    }

    // 기타줄 팩만 사는 경우와 낱개만 사는 경우,
    // 팩으로 6개씩 산 뒤 나머지를 낱개로 사는 경우를 각각 저장
    price[0] = pack * (N / 6 + (N % 6 != 0));
    price[1] = one * N;
    price[2] = pack * (N / 6) + one * (N % 6);

    // price의 최솟값을 ans에 저장한다
    for (int i = 0; i < 3; i++) ans = min(ans, price[i]);

    // 기타줄을 사는 최소 비용을 출력한다
    printf("%d\n", ans);

    return 0;
}

'알고리즘 > 문제 풀이' 카테고리의 다른 글

1074번: Z  (0) 2021.12.06
1065번: 한수  (0) 2021.12.06
1043번: 거짓말  (0) 2021.12.06
1041번: 주사위  (0) 2021.12.06
1026번: 보물  (0) 2021.12.06