본문 바로가기
알고리즘

백준 11066 파일합치기 (java)

by 창따오 2023. 12. 5.
728x90

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

소스코드

package baekjoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Baek11066 {
    static int tc;
    static StringBuilder sb = new StringBuilder();
    static int k; //파일의 크기

    public static void main(String[] args) throws IOException {
        //풀어야 할 문제...
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        tc = Integer.parseInt(br.readLine());
        for (int t = 0; t < tc; t++) {
            k = Integer.parseInt(br.readLine());
            int[][] dp = new int[k + 1][k + 1]; //dp에 담길 값은 특정 chapter 부터 또다른 특정 chapter까지
            int[] sum = new int[k + 1];
            int[] chapters = new int[k + 1];
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int n = 1; n <= k; n++) {
                chapters[n] = Integer.parseInt(st.nextToken());
                sum[n] = sum[n - 1] + chapters[n];
            }
            for (int i = 1; i < k; i++) {
                for (int from = 1; from + i <= k; from++) {
                    int to = from + i;
                    dp[from][to] = Integer.MAX_VALUE;
                    for (int divide = from; divide < to; divide++) {
                        dp[from][to] = Math.min(dp[from][to], dp[from][divide] + dp[divide + 1][to] + sum[to] - sum[from - 1]);
                    }
                }
            }
            sb.append(dp[1][k]).append("\n");
        }
        System.out.println(sb.toString());
    }

}

느낀점 : 오랜시간을 할애하여 이해하게 되었다. 하지만 이해를 했다고 하여 코드로 녹여 내는 과정은 연습이 더 필요한 것 같다. Detail이 부족함을 느낀다.