상세 컨텐츠

본문 제목

백준#1049 - 기타줄

C#/알고리즘

by McRobbin 2020. 4. 12. 16:51

본문

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

 

1049번: 기타줄

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

www.acmicpc.net

그리디 알고리즘으로 분류된 1049번 기타줄 문제 입니다.

 

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
46
47
48
49
50
51
52
53
54
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace _1049
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] splitInput = Console.ReadLine().Split(' ');
            int needCount = int.Parse(splitInput[0]);
            int brandCount = int.Parse(splitInput[1]);
 
            //최소 패키지 가격과 최소 낱개 가격을 초기화.
            int minPackageCost = int.MaxValue;
            int minPieceCost = int.MaxValue;
 
            for(int i = 0; i < brandCount; i++)
            {
                string[] strSplitCost = Console.ReadLine().Split(' ');
 
                //입력 받은 패키지 값이 최소 패키지 값보다 작을 때.
                if (int.Parse(strSplitCost[0]) < minPackageCost)
                    minPackageCost = int.Parse(strSplitCost[0]);
 
                //낱개 가격이 최소 낱개 가격보다 작을 때.
                if (int.Parse(strSplitCost[1]) < minPieceCost)
                    minPieceCost = int.Parse(strSplitCost[1]);
            }
 
            //낱개 6개의 가격이 패키지 보다 작다면
            if (minPieceCost * 6 <= minPackageCost)
            {
                Console.WriteLine(needCount * minPieceCost);
                return;
            }
 
            //패키지 구매가 이득일 때 까지 구매.
            int usePackageCost = (needCount / 6* minPackageCost;
            needCount = needCount % 6;
 
            //패키지 구매후 남은 갯수를 패키지로, 낱개로 살지 결정.
            if (needCount * minPieceCost <= minPackageCost)
                Console.WriteLine(usePackageCost + needCount * minPieceCost);
 
            else
                Console.WriteLine(usePackageCost + minPackageCost);
        }
    }
}
 
 

 

필요한 기타줄의 갯수, 브랜드의 수와 브랜드에서 판매되는 각각의 패키지, 낱개 가격이 주어

졌을 때 필요한 최소한 금액의 가격을 구하느 문제 입니다. 패키지는 줄 6개로 이루어집니다.

 

ex)

10 3

20 8

40 7

60 4

입력 값이 다음과 같이 주어지며 첫줄이 필요한 기타줄, 브랜드 갯수 이고

다음 줄부터 각 브랜드의  패키지 낱개 가격이 되겠습니다.

 

제가 가장먼저 생각한 이 문제의 접근 모든 브랜드의 패키지와 낱개 가격이 주어지지만

각각의 최소 가격을 제외 하고는 관심이 없다는 것 입니다.

제가 만일 패키지를 구매한다면 가격이 20인 브랜드에서 구매하고 다른 곳은 쳐다도 안볼겁니다.

마찬가지로 낱개를 구매한다면 가격이 4인 브랜드에서 구매할 것입니다.

 

입력을 받을 때부터 최소 가격을 각각 구할겁니다. minPackageCost 와 minPieceCost를

int의 최댓값으로 초기화 하고 입력 받는 족족 최솟값을 넣도록 했습니다.

 

다음으로 낱개 6개의 가격이 패키지 하나의 가격보다 저렴할 수 있습니다. 이 경우

필요한 갯수를 전부 낱개로 구매해 출력하고 종료합니다.

 

아닐 경우 패키지 구매를 반드시 해야 이득이며 패키지를 사서 줄이 남지 않을 때까지

패키지를 구매합니다. 그럼 6의 나머지로 필요한 줄의 갯수가 남게 됩니다.

 

마지막으로 남은 갯수를 패키지로 하나 구매할지 낱개로 갯수를 맞춰 구매할지 결정합니다.

이를 계산하고 결과를 출력하면 되겠습니다.

'C# > 알고리즘' 카테고리의 다른 글

백준#1138 - 한 줄로 서기  (0) 2020.04.13
백준#2529 - 부등호  (0) 2020.04.12
백준#1946 - 신입 사원  (0) 2020.04.12
백준#1120 - 문자열  (0) 2020.04.11
백준#1541 - 잃어버린 괄호  (0) 2020.04.11

관련글 더보기