Algorithm/BOJ(Baekjoon Online Judge)
[백준 - 7579번] 앱 - Java //Wello Horld//
koucop
2019. 7. 26. 15:54
이번에는 BOJ의 7579번 문제 "앱"을 풀어보도록 하자
일단, 문제가 매우 길다. 쉽게 설명해 주면 앱에 백그라운드에 사용되어지고 있는 메모리가 있고, 그 메모리를 처리하는데 비용이 드는데, 입력으로 앱의 개수 N이 나오고, 확보하기위한 메모리바이트 수인 M이 주어진다. 그 다음에, 앱의 개수 N개 만큼 사용중인 메모리의 바이트m이 차례대로 주어진다. 그리고, 앱의 개수 N개 만큼 메모리를 확보하기위해 앱을 비활성화 했을 때 드는 비용 c가 차례대로 주어진다. 출력으로는 필요한 메모리 바이트 수인 M을 확보하기 위한 최소의 비용을 구하면 된는 문제이다.
문제가 길긴하나, 푸는 방법은 간단한다.
import java.io.*;
import java.util.*;
public class sample {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
long M = Long.parseLong(st.nextToken());
App[] apps = new App[N];
st = new StringTokenizer(br.readLine());
//입력을 받는 부분
for(int i = 0; i < N; i++){
apps[i] = new App(Long.parseLong(st.nextToken()), 0);
}
int allCost = 0;
st = new StringTokenizer(br.readLine());
for(int i = 0; i < N; i++){
apps[i].c = Integer.parseInt(st.nextToken());
allCost += apps[i].c;
}
//전체비용만큼 dp를 할당시킴(자료형은 long -> 10,000,000)
long[] dp = new long[allCost + 1];
//전체적으로 훑어줌
for(int i = 0; i < N; i++){
for(int j = allCost; j >= apps[i].c; j--){
dp[j] = Math.max(dp[j], dp[j - apps[i].c] + apps[i].m);
}
}
//0부터 전체비용까지 루프를 돌림. dp[i]값이 M이넘을 때의 비용이 최소비용이므로, 루프를 멈춰줌.
for(int i = 0; i <= allCost; i++){
if(dp[i] >= M){
bw.write(i + "\n");
break;
}
}
bw.flush();
br.close();
bw.close();
}
static class App{
long m;
int c;
public App(long m, int c){
this.m = m;
this.c = c;
}
}
}
문제 : https://www.acmicpc.net/problem/7579
7579번: 앱
입력은 3줄로 이루어져 있다. 첫 줄에는 정수 N과 M이 공백문자로 구분되어 주어지며, 둘째 줄과 셋째 줄에는 각각 N개의 정수가 공백문자로 구분되어 주어진다. 둘째 줄의 N개의 정수는 현재 활성화 되어 있는 앱 A1, ..., AN이 사용 중인 메모리의 바이트 수인 m1, ..., mN을 의미하며, 셋째 줄의 정수는 각 앱을 비활성화 했을 경우의 비용 c1, ..., cN을 의미한다 단, 1 ≤ N ≤ 100, 1 ≤ M ≤ 10,000,000이며, 1
www.acmicpc.net