티스토리 뷰

알고리즘

1049번 기타줄

심재철 2017. 8. 10. 01:06

김지민은 세계적인 기타 플레이어이다. 불행하게도 N개의 줄이 끊어졌다. 따라서 새로운 줄을 사거나 교체해야 한다. 

세계적인 기타리스트인 김지민은 되도록이면 돈을 적게쓰려고 한다. 김지민은 6줄 패키지를 살 수도 있지만, 1개 또는 그 이상의 

줄을 낱개로 살 수도 있다. 끊어진 기타 줄의 개수 N과 기타줄 브랜드 M개가 주어지고, 

각각의 브랜드에서 파는 기타줄 6개가 들어있는 패키지의 가격, 낱개로 살 때의 가격이 주어질 때, 

적어도 N개를 사기 위해 필요한 돈의 수를 최소로 하는 프로그램을 작성하시오.

입력

첫째 줄에 N과 M이 주어진다. N은 100보다 작거나 같은 자연수이고, M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 M개의 줄에는 

각 브랜드의 패키지 가격과 낱개의 가격이 공백으로 구분하여 주어진다. 가격은 0보다 크거나 같고, 1,000보다 작거나 같은 자연수이다.

출력

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

예제 입력 
4 2
12 3
15 4

예제 출력 

12



이 문제는 정답률은 29%지만 그리디 알고리즘의 기초정도 수준인거 같다.


약간의 고민을 통해서 문제를 해결할수있었다.


우선


문제에 주어진 패키지가격을 하나의 배열로 잡고 낱개를 하나의 배열로 잡아서


두개의 배열을 오름차순으로 정렬을 시킨다. 그렇게 되면 패키지로 샀을때 가장 저렴한것, 낱개로 샀을때 가장 저렴한 것이 뭔지 알수

있다.


돈을 최소로 해서 지민이가 필요한 만큼 기타줄을 사는 방법은 가장싼 패키지가격과 가장싼 낱개가격 두개를 비교해서 만약에


사야될 기타줄의 수가 6개이상이라면 패키지가격과 낱개*6의 가격을 비교해서 더 저렴한것을 구매하도록 하고 


만약 6개 미만이라면 패키지가격과 낱개*남은 사야되는 기타줄의수를 비교해서 구매하도록 한다.


코드에 주석이 자세히 달려있으므로 쉽게 이해할 거라 생각한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int n,m;
int pakage[51];
int individual[51];
 
 
int main()
{
    cin >> n>>m;
    
    for (int i = 1; i <= m; i++)
        scanf("%d %d"&pakage[i], &individual[i]);
    sort(pakage+1 , pakage + m+1);
    sort(individual+1 , individual + m+1);// 값싼 순서대로 정렬
    int price = 0//기타줄을 사는데 필요한 돈
 
    while (n > 0// 사야되는 기타줄의 개수가 0보다 작아질떄까지 반복 
    {
        if (n>=6 && pakage[1< individual[1* 6// 사야되는 기타줄이 6개이상 있고 패키지가 낱개6개보다 싼경우
        {
            n -= 6//사야되는 기타줄의 수는 패키지를 샀으므로 6개가 줄어든다.
            price += pakage[1]; // 현재 쓴돈은 패키지 구입비용만큼
        }
        else if (n<6 && pakage[1< individual[1]*n) //사야되는 기타줄의 수가 6미만이면 낱개랑 비교해서 뭐가더 싼지
        {
            price += pakage[1];
            n -= 6;
        }
        else
        {
            price += individual[1* n;
            n = 0;
        }
    }
    
    cout << price << endl;
    
 
    return 0;
}
 
cs






댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함