2024. 7. 9. 18:33ㆍIT/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()를 사용한 부분이 코드를 간결하게 하는 핵심이었다.
문제를 처음 접하는 경우에 약간은 막막하게 느껴질 수 있는 문제이지만,
세 가지 역량을 모두 취하는 경우(간단하게 생각하는 경우)를 생각한 뒤에
이를 바탕으로 좀 더 복잡한 방향으로 사고를 넓히는 쪽으로 문제를 풀이하였다.
'IT > BaekJoon' 카테고리의 다른 글
[BAEKJOON] 백준 19698: 헛간 청약 (C#) (0) | 2024.07.31 |
---|---|
[BAEKJOON] 백준 1940: 주몽 (C#) (0) | 2024.07.31 |
[BAEKJOON] 백준 16162: 가희와 3단 고음 (C#) (0) | 2024.07.09 |
[BAEKJOON] 백준 11283: 한글 2 (C#) (0) | 2024.07.09 |
[BAEKJOON] 백준 11282: 한글 (C#) (0) | 2024.07.09 |