[BAEKJOON] 백준 9070: 장보기 (C#)

2024. 8. 13. 09:51IT/BaekJoon

문제 링크

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

 

 

문제

평소 맛살을 즐겨 먹는 혜선은 맛살을 구입하러 2-마트에 갔다. 식품코너에서 맛살을 고르면서 혜선은 고민이 되기 시작했다. 여러 업체에서 나온 맛살들이 들어있는 개수도 다르고 가격도 다르기 때문에 어떤 것을 사야 싼 가격에 많이 먹을 수 있을지 생각해야 했기 때문이다. 

혜선은 현명하게도 각 맛살에 써진 중량(g)과 가격(원)을 다 조사해서 같은 가격으로 최대한 많은 중량을 살 수 있는 맛살을 사기로 했다. 혜선의 고민을 해결해 줄 프로그램을 작성하시오.

 

 

입력

입력은 표준입력(standard input)을 통해 받아들인다. 입력의 첫 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스는 첫째 줄에는 맛살의 종류 N이 주어지고 두 번째 줄부터는 각 맛살의 중량(g) W와 가격(원) C가 순서대로 공백 하나를 사이에 두고 한 줄에 하나씩 N개가 주어진다. (1 ≤ N ≤ 100, 1 ≤ W ≤ 5000, 1 ≤ C ≤ 100000, W와 C는 정수)

 

 

출력

출력은 표준출력(standard output)을 통하여 출력한다. 각 테스트 케이스에 대해서 혜선이 사야 하는 맛살의 가격을 한 줄에 하나씩 출력하시오. 같은 가격으로 살 수 있는 최대 중량이 같은 맛살이 두 개 이상인 경우는 낮은 가격의 것을 사기로 한다. 

 

 

 

통과한 답안

namespace _9070
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int T = int.Parse(Console.ReadLine());
            for (int test = 0; test < T; test++)
            {
                int N = int.Parse(Console.ReadLine());
                Dictionary<int, int> dict = new Dictionary<int, int>();
                for (int i = 0; i < N; i++)
                {
                    string[] inputs = Console.ReadLine().Split(' ');
                    int weight = int.Parse(inputs[0]);
                    int price = int.Parse(inputs[1]);

                    if (dict.ContainsKey(weight))
                    {
                        if (price < dict[weight])
                        {
                            dict[weight] = price;
                        }
                    }
                    else
                    {
                        dict.Add(weight, price);
                    }
                }

                var lowestPrice = dict
                    .OrderBy(x => (double)x.Value / x.Key)
                    .ThenBy(x => x.Value)
                    .First();

                Console.WriteLine(lowestPrice.Value);
            }
        }
    }
}

 

여러 종류의 맛살의 무게와 가격이 주어졌을 때, 가장 가성비가 좋은 맛살의 가격을 출력하는 문제이다.

이 문제에서도 Dictionary와 LINQ를 이용하였으며,

각각의 입력값에 대해서 이미 존재하고 있는 무게라면 더 저렴한 것을 저장하고

(Dictionary의 특징으로 중복되는 인덱스는 여러개일 수 없으므로 하나를 선택해야 되므로,

 가성비가 좋은지 비교하려면 더 낮은 가격을 저장한 후에 비교하면 된다)

존재하지 않는 무게라면 그 가격을 저장하였다.

 

이후에 LINQ를 이용하여 (가격 / 중량)의 순으로 정렬한 뒤에

만약 같은 가성비를 가지는 물품이 있을 수 있으므로 가격으로 추가로 정렬한 뒤에

0번 인덱스에 있는 값을 출력하도록 구현하였다.

 

LINQ를 사용하는데에만 신경쓰다가 '런타임 에러 (Argument)'가 발생했던 문제였는데

해당 문제는 Dictionary(뿐만 아니라 대부분의 자료 구조)에서

같은 인덱스에 값을 추가(2개 이상의 값을 갖게 하는 것)하려다가 생긴 문제였다.

이는 문제의 조건에 따라서 가성비가 좋은 물품의 값을 남기게하여 해결할 수 있었다.