프로그래밍 문제/BOJ(백준 온라인 저지)
[BOJ 11066번] 파일 합치기(JAVA)
테크케찰
2020. 9. 11. 21:57
11066번: 파일 합치기
소설가인 김대전은 소설을 여러 장(chapter)으로 나누어 쓰는데, 각 장은 각각 다른 파일에 저장하곤 한다. 소설의 모든 장을 쓰고 나서는 각 장이 쓰여진 파일을 합쳐서 최종적으로 소설의 완성본
www.acmicpc.net
import java.io.*;
import java.util.*;
class Main{
static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
static StringBuilder sb=new StringBuilder();
public static void main(String args[]) throws Exception {
int T=Integer.parseInt(br.readLine());
for(int iter=0;iter<T;iter++) {
int N=Integer.parseInt(br.readLine());
String str[]=br.readLine().split(" ");
int arr[]=new int[N];
for(int i=0;i<N;i++) {
arr[i]=Integer.parseInt(str[i]);
}
bw.write(function(arr)+"\n");
}
bw.flush();
bw.close();
}
public static int sum(int[] arr, int s, int e) {
if(s==0) return arr[e];
else return arr[e]-arr[s-1];
}
public static int function(int[] arr) {
int dp[][]=new int[arr.length][arr.length];
int s[]=new int[arr.length];
s[0]=arr[0];
for(int i=1;i<arr.length;i++) {
s[i]=s[i-1]+arr[i];
}
for(int i=0;i<arr.length-1;i++) {
dp[i][i+1]=arr[i]+arr[i+1];
}
for(int gap=2;gap<arr.length;gap++) {
for(int i=0;i+gap<arr.length;i++) {
int j=i+gap;
dp[i][j]=Integer.MAX_VALUE;
for(int k=i;k<j;k++) {
dp[i][j]=Math.min(dp[i][k]+dp[k+1][j]+sum(s, i, j), dp[i][j]);
}
}
}
return dp[0][arr.length-1];
}
}
문제가 어려워서 아래 블로그 링크를 참고해서 풀었습니다.
m.blog.naver.com/tjdwns0920/221135677693
[DP] 동적계획법 - 파일 합치기
[DP] 동적계획법 - 파일 합치기 ※ Java로 풀이했습니다.BaekJoon[백준] : 11066 - 파일 합치기입력* ...
blog.naver.com
dp[i][j]는 i번째부터 j번째 인덱스까지의 최소 합을 의미합니다.
dp[i][j]=dp[i][k]+dp[k+1][j]
위 문장이 핵심인데요, dp[i][j]는 i번째부터 k번째 인덱스까지의 최소합 + k+1번째부터 j번째 인덱스까지의 최소합 입니다.
삼중 포문을 이용해 이 문장을 돌려서 정답을 구할 수 있었습니다.