안녕하세요, GameLabMaster입니다! 이번 코딩 테스트 대비 포스팅에서는 동적 프로그래밍(Dynamic Programming) 기법을 활용한 '0-1 Knapsack Problem'에 대해 알아보겠습니다.
문제
당신은 배낭 한 개와 N개의 아이템들을 가지고 있습니다. 각 아이템은 무게와 가치를 가지고 있습니다. 배낭의 최대 무게는 W이며, 배낭에 담을 수 있는 아이템들의 최대 가치를 구하는 프로그램을 작성하세요. 이때, 아이템은 0개 또는 1개만 담을 수 있습니다. (0-1 Knapsack Problem)
입력
- 아이템의 개수 N (1 ≤ N ≤ 100)
- 배낭의 최대 무게 W (1 ≤ W ≤ 100,000)
- N개의 아이템 정보, 각 줄에는 아이템의 무게 Wi와 가치 Vi가 주어집니다. (1 ≤ Wi, Vi ≤ 1000)
출력
- 배낭에 담을 수 있는 아이템들의 최대 가치
풀이
이 문제는 동적 프로그래밍 기법을 사용하여 해결할 수 있습니다. DP 테이블을 생성하고, 각 아이템에 대해 배낭에 담을 수 있는 경우와 담지 않는 경우를 비교하여 최대 가치를 구합니다.
다음은 C#으로 작성한 '0-1 Knapsack Problem' 풀이 코드입니다.
using System;
class Program {
static void Main(string[] args) {
int n = int.Parse(Console.ReadLine());
int w = int.Parse(Console.ReadLine());
int[] weights = new int[n + 1];
int[] values = new int[n + 1];
for (int i = 1; i <= n; i++) {
string[] input = Console.ReadLine().Split(' ');
weights[i] = int.Parse(input[0]);
values[i] = int.Parse(input[1]);
}
int[,] dp = new int[n + 1, w + 1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= w; j++) {
if (weights[i] <= j) {
dp[i, j] = Math.Max(dp[i - 1, j], dp[i - 1, j - weights[i]] + values[i]);
} else {
dp[i, j] = dp[i - 1, j];
}
}
}
Console.WriteLine(dp[n, w]);
}
}
이 코드는 먼저 아이템의 무게와 가치를 입력받고, 동적 프로그래밍 테이블 dp를 초기화합니다. 그 다음, 각 아이템에 대해 배낭에 담을 수 있는 경우와 담지 않는 경우를 비교하여 최대 가치를 구하고 출력합니다.
이렇게 동적 프로그래밍 기법을 활용하여 '0-1 Knapsack Problem'을 해결할 수 있습니다. 이 기법을 익히면 다양한 동적 프로그래밍 문제를 쉽게 해결할 수 있으므로, 코딩 테스트 대비에 도움이 될 것입니다. 다음 포스팅에서는 다른 동적 프로그래밍 문제에 대해 알아보겠습니다.
'Coding Test' 카테고리의 다른 글
코딩 테스트 대비: 플로이드-와샬 알고리즘 - 모든 정점 쌍의 최단 경로 찾기 (C#) (0) | 2023.05.07 |
---|---|
코딩 테스트 대비: 슬라이딩 윈도우 기법 - 연속된 구간의 최대 합 구하기 (C#) (0) | 2023.05.04 |
코딩 테스트 대비: '네트워크 연결' 문제 풀이 - Kruskal 알고리즘 적용 (C#) (1) | 2023.04.28 |
코딩 테스트 대비: 그래프 이론 기초 이해 및 적용 (C#) (0) | 2023.04.28 |
코딩 테스트 대비: 투 포인터 알고리즘 이해 및 적용 (C#) (0) | 2023.04.27 |