문제 풀이/문제 풀이(BOJ)

[Silver IV] 기타줄 - 1049

풀뿌리 2024. 1. 18. 23:01
[문제 링크] : https://www.acmicpc.net/problem/1049

### 성능 요약

메모리: 2020 KB, 시간: 0 ms

### 분류

그리디 알고리즘, 수학

### 제출 일자

2023년 9월 5일 19:19:03

### 문제 설명

Day Of Mourning의 기타리스트 강토가 사용하는 기타에서 N개의 줄이 끊어졌다. 따라서 새로운 줄을 사거나 교체해야 한다. 강토는 되도록이면 돈을 적게 쓰려고 한다. 6줄 패키지를 살 수도 있고, 1개 또는 그 이상의 줄을 낱개로 살 수도 있다.

끊어진 기타줄의 개수 N과 기타줄 브랜드 M개가 주어지고, 각각의 브랜드에서 파는 기타줄 6개가 들어있는 패키지의 가격, 낱개로 살 때의 가격이 주어질 때, 적어도 N개를 사기 위해 필요한 돈의 수를 최소로 하는 프로그램을 작성하시오.

### 입력

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

### 출력

첫째 줄에 기타줄을 적어도 N개 사기 위해 필요한 돈의 최솟값을 출력한다.

### 문제 풀이

### 작성한 코드

#include 
#define INF 0x7f7f7f7f
using namespace std;
int n,m,case1,case2,case3;
int packageMin = INF, eachMin = INF;

int main(){
    cin >> n >> m;
    for(int i = 0; i < m; i++){
        int six,one;
        cin >> six >> one;
        packageMin = min(six,packageMin);
        eachMin = min(one, eachMin);
    }
    //n개 이상으로 줄을 패키지 살 때
    if(n % 6 == 0) case1 = n / 6 * packageMin;
    else case1 = (n / 6 + 1) * packageMin;
    
    //2. n개 이상 줄을 1개씩 살 때
    case2 = eachMin * n;

    //3. n개 미만으로 최대한 6개씩 산 후 나머지를 1개씩 살 때
    case3 = n / 6 * packageMin + n % 6 * eachMin;
    cout << min({case1,case2,case3});
}