7579번: 앱
입력은 3줄로 이루어져 있다. 첫 줄에는 정수 N과 M이 공백문자로 구분되어 주어지며, 둘째 줄과 셋째 줄에는 각각 N개의 정수가 공백문자로 구분되어 주어진다. 둘째 줄의 N개의 정수는 현재 활
www.acmicpc.net
아이디어💡
DP
- 초기화
- 각 앱의 메모리 사용량과 비활성화 비용을 저장하기 위한 Memory 객체 배열 memories를 생성합니다.
- DP 배열 정의
- dp[j]를 메모리 j를 확보하기 위한 최소 비용으로 정의합니다. 이 배열은 최대 필요 메모리 M까지 고려하여 초기화됩니다.
- DP 초기화
- 첫 번째 앱을 사용하여 dp 배열을 초기화합니다. 첫 번째 앱의 메모리가 M을 넘지 않는 범위 내에서, 해당 앱의 비용으로 초기화합니다.
- DP 점화식 적용
- 만약 현재 살펴보는 메모리 j가 현재 앱의 메모리보다 작거나 같다면, dp[j]는 현재 앱의 비용과 기존의 dp[j] 중 더 작은 값으로 업데이트됩니다.
- j가 더 크다면, 이전 단계에서 j - 현재 앱의 메모리만큼의 메모리를 확보하는 비용에 현재 앱의 비용을 더한 값과 기존의 dp[j] 중 더 작은 값으로 dp[j]를 업데이트합니다.
- 결과 출력
- 필요한 메모리 M을 확보하기 위해 필요한 최소 비용을 dp[M]에서 찾아 출력합니다.
시간복잡도⌛
- 전체 앱 개수 * 확보해야 하는 메모리 = O(M*N) 이하
전체 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
Memory[] memories = new Memory[N];
// 메모리
st = new StringTokenizer(br.readLine());
for(int i=0; i<N; i++) {
memories[i] = new Memory(Integer.parseInt(st.nextToken()));
}
// 코스트
st = new StringTokenizer(br.readLine());
for(int i=0; i<N; i++) {
memories[i].cost = Integer.parseInt(st.nextToken());
}
int INF = 10_000_001;
int[] dp = new int[M+1];
int lastMemory = memories[0].memory;
Arrays.fill(dp, INF);
for(int j=0; j<=Math.min(lastMemory, M); j++) {
dp[j] = memories[0].cost;
}
for(int i=1; i<N; i++) {
lastMemory += memories[i].memory;
for (int j = Math.min(lastMemory, M); j >= 0; j--) {
if(j <= memories[i].memory) {
dp[j] = Math.min(dp[j], memories[i].cost);
} else if(j <= lastMemory) {
dp[j] = Math.min(dp[j], dp[j-memories[i].memory] + memories[i].cost);
}
}
}
System.out.println(dp[M]);
}
static class Memory {
int memory, cost;
public Memory(int memory) {
this.memory = memory;
}
public Memory(int memory, int cost) {
this.memory = memory;
this.cost = cost;
}
}
}
'알고리즘' 카테고리의 다른 글
[백준] 21610. 마법사 상어와 비바라기 (Java) (0) | 2024.04.21 |
---|---|
[백준] 4485. 녹색 옷 입은 애가 젤다지? (Java) (0) | 2024.04.21 |
[백준] 1463. 1로 만들기(Java) (0) | 2024.04.21 |
[백준] 2747. 피보나치 수(Java) (1) | 2024.04.21 |
[백준] 2839. 설탕 배달(Java) (0) | 2024.04.21 |