[BAEKJOON] 백준 27922: 현대모비스 입사 프로젝트 (C#)

2024. 7. 9. 18:33IT/BaekJoon

문제 링크

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

 

 

문제

취업준비생인 도훈이는 꿈의 직장인 현대모비스의 채용 공고를 보고, 현대모비스에 입사하기 위해 소프트웨어 및 하드웨어 역량을 기르는 단기간 집중 공부 프로젝트를 시작했다. 효율적인 공부를 위해 자동차 소프트웨어의 핵심 기술인 통신기술, 알고리즘, 기계구조학 역량을 기를 수 있는 강의 𝑁개를 찾았고, 그 중 𝑖번째 강의는 세 종류의 역량을 각각 𝑎𝑖,𝑏𝑖,𝑐𝑖만큼 증가시켜준다고 한다.

도훈이는 𝑁개의 강의를 모두 수강하고 싶었으나, 현대모비스 입사 지원 시기가 얼마 남지 않았기에 𝐾개의 강의만을 골라 수강하고자 한다. 또한, 시간이 촉박해 세 종류의 역량을 모두 기르기는 힘들다고 판단한 도훈이는 선택과 집중을 통해 세 종류의 역량 중 두 가지 역량만을 최대화하고자 한다. 이미 공부하느라 바쁜 도훈이를 위해, 𝑁개의 강의 중 𝐾개의 강의를 수강했을 때 얻을 수 있는 두 종류의 역량의 합의 최댓값을 구해주자.

 

 

입력

첫 번째 줄에 강의의 총 개수 𝑁과 수강할 강의의 개수 𝐾가 공백으로 구분되어 주어진다. (1≤𝐾≤𝑁≤100000)

두 번째 줄부터 𝑁+1번째 줄까지, 𝑖+1번째 줄에 𝑖번째 강의를 들었을 때 증가하는 통신기술 역량 𝑎𝑖, 알고리즘 역량 𝑏𝑖, 기계구조학 역량 𝑐𝑖가 공백으로 구분되어 정수로 주어진다. (0≤𝑎𝑖,𝑏𝑖,𝑐𝑖≤10000) 

 

 

출력

 𝐾개의 강의를 수강했을 때 얻을 수 있는 두 종류의 역량의 합의 최댓값을 출력한다.

 

 

 

통과한 답안

namespace _27922
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string[] inputs = Console.ReadLine().Split(' ');
            int N = int.Parse(inputs[0]);
            int K = int.Parse(inputs[1]);
            int[][] lectures = new int[N][];

            for (int i = 0; i < N; i++)
            {
                lectures[i] = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);
            }

            long[] sumAB = new long[N];
            long[] sumBC = new long[N];
            long[] sumCA = new long[N];

            for (int i = 0; i < N; i++)
            {
                sumAB[i] = lectures[i][0] + lectures[i][1];
                sumBC[i] = lectures[i][1] + lectures[i][2];
                sumCA[i] = lectures[i][2] + lectures[i][0];
            }

            Array.Sort(sumAB, (x, y) => y.CompareTo(x));
            Array.Sort(sumBC, (x, y) => y.CompareTo(x));
            Array.Sort(sumCA, (x, y) => y.CompareTo(x));

            long maxAB = sumAB.Take(K).Sum();
            long maxBC = sumBC.Take(K).Sum();
            long maxCA = sumCA.Take(K).Sum();

            Console.WriteLine(Math.Max(maxAB, Math.Max(maxBC, maxCA)));
        }
    }
}

 

세 가지 역량 a, b, c를 올려주는 N개의 강의들 중에서 K개를 수강했을 때,

얻을 수 있는 두 가지 역량의 최댓값을 구하는 문제이다.

 

얻을 수 있는 세 가지 역량의 최댓값을 구하는 문제는 각 입력값들의 합을 구한 뒤

내림차순으로 정렬하여, 앞에서부터 K개를 뽑으면 되지만,

 

세 가지 역량 중에서 두 가지 역량의 최댓값을 구해야되므로 중간의 한 과정을 추가해야한다.

각 입력값들에서 2개의 역량의 값의 합을 구하고(sumAB, sumBC, sumCA 배열)

이들을 내림차순으로 정렬한 후에, K개를 뽑고 Math.Max를 이용하였다.

이 과정에서 LINQ의 Take()를 사용한 부분이 코드를 간결하게 하는 핵심이었다.

 

문제를 처음 접하는 경우에 약간은 막막하게 느껴질 수 있는 문제이지만,

세 가지 역량을 모두 취하는 경우(간단하게 생각하는 경우)를 생각한 뒤에

이를 바탕으로 좀 더 복잡한 방향으로 사고를 넓히는 쪽으로 문제를 풀이하였다.