백준_파일 합치기_11066[Java]

2019. 4. 24. 21:51알고리즘문제/백준

문제

https://www.acmicpc.net/problem/11066

 

11066번: 파일 합치기

문제 소설가인 김대전은 소설을 여러 장(chapter)으로 나누어 쓰는데, 각 장은 각각 다른 파일에 저장하곤 한다. 소설의 모든 장을 쓰고 나서는 각 장이 쓰여진 파일을 합쳐서 최종적으로 소설의 완성본이 들어있는 한 개의 파일을 만든다. 이 과정에서 두 개의 파일을 합쳐서 하나의 임시파일을 만들고, 이 임시파일이나 원래의 파일을 계속 두 개씩 합쳐서 소설의 여러 장들이 연속이 되도록 파일을 합쳐나가고, 최종적으로는 하나의 파일로 합친다. 두 개의 파일을

www.acmicpc.net

 

풀이

DP로 해결한다. 

생각하기 쉽지 않아 다른 분들 코드를 참고했다.

 

점화식은 다음과 같다. 

DP[j][i]  =  DP[j][s] + DP[s+1][i] + SUM[j~i]

* DP[j][i] : j에서 i까지의 파일을 합치는데 드는 최소 비용

* SUM[j~i]는  j ~ i 까지의 총합으로 SUM[i] - SUM[j-1] 이다.

 

/*

* 각 장은 다른 파일에 저장

* 이 다른 파일을 최종 합쳐서 완성본인 파일 하나 만듦

* 과정 : 두개의 파일을 합친다 -> 임시파일 

* 이 임시파일이나 원래의 파일 두개 합쳐서 여러 장들이 연속되도록 합쳐나간다. 

* 합치는 비용 : 두 파일 크기의 합 

* 필요한 비용의 최소 합을 구하자 

*/

 

코드

 

import java.util.Scanner;

public class Main {
	static int T, K;
	static int[] fic;
	static int[] sum;
	static int[][] dp;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		T = sc.nextInt();

		for(int test = 0; test < T; test++) {
			
			K = sc.nextInt();
			
			fic = new int[K+1];
			sum = new int[K+1];
			dp = new int[502][502];
			
			for(int i = 1; i <= K; i++) {
				fic[i] = sc.nextInt();
				sum[i] = sum[i-1]+ fic[i];
			}
			
			for (int i = 2; i <= K; i++)
	        {
	            for (int j = i - 1; j > 0; j--)
	            {
	                dp[j][i] = 999999999;
	                for (int s = j; s <= i; s++)
	                    dp[j][i] = Math.min(dp[j][i], dp[j][s] + dp[s + 1][i]);
	 
	                dp[j][i] += sum[i] - sum[j - 1];
	            }
	        }

			
			System.out.println(dp[1][K]);
			
			
		}
		
		sc.close();
	}

}

 

참고

https://stack07142.tistory.com/69

 

BOJ#11066 파일 합치기 (Merging Files)

BOJ#11066 파일 합치기 (Merging Files) * 문제 https://www.acmicpc.net/problem/11066 * 풀이 수열이 주어지고, 인접한 숫자는 합칠 수 있습니다. 합치는 비용은 두 수의 합이고, 전체 수를 합치는데 필요한 최..

stack07142.tistory.com

https://www.crocus.co.kr/1073

 

[11066번] 파일 합치기

문제 출처 : https://www.acmicpc.net/problem/11066 알고리즘 분석 : 문제 해결에 필요한 사항 1. Dynamic Programming 2. 점화식 세우는 방법 3중 포문을 이용하여 문제를 해결 할 수 있다. 점화식은 다음과 같..

www.crocus.co.kr

https://xyom.github.io/2017/12/26/%EB%B0%B1%EC%A4%80%2011066%20%ED%8C%8C%EC%9D%BC%ED%95%A9%EC%B9%98%EA%B8%B0/

 

백준 11066 파일합치기

파일 합치기 문제는 인접한 파일을 합치고 합쳐진 파일을 다른 파일과 합쳐나가며 이 파일을 합치는데 필요한 비용을 최소화 하는 문제이다. 이 문제는 동적 계획법으로 풀 수 있다. 이 부분에 대한 개념은 구간에 대한 개념으로 나누어 보면 쉽게 풀 수 있다. 1 ~ n까지의 구간이 있다고 하면 1~n까지의 구간의 합을 최소로 만드는 것은 임의의 j에 대하여

xyom.github.io