티스토리 뷰

알고리즘/BOJ

[BOJ-11066] 파일합치기

개발하는 후딘 2020. 3. 2. 06:11
728x90
반응형

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

 

11066번: 파일 합치기

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

www.acmicpc.net


[풀이]

참고 블로그1: https://blog.naver.com/tjdwns0920/221135677693

참고 블로그2: https://js1jj2sk3.tistory.com/search/11066

참고 블로그3: https://kyunstudio.tistory.com/75


[python] 시간초과 ㅠㅠ;

# -*- coding: utf-8 -*-
import sys

def main():
    T=int(sys.stdin.readline())
    for _ in range(T):
        # K: 소설을 구성하는 장의 수 (3<=K<=500)
        K= int(sys.stdin.readline())
        cost=list(map(int, sys.stdin.readline().split()))
        dp=[[0]*(K+1) for _ in range(K+1)] #초기화
        s=[0]*(K+1) #초기화

        for i in range(1,K+1):
            #cost는 시작인덱스가 0부터이다..
            #1부터 i까지의 합
            s[i]=s[i-1]+cost[i-1]
        for d in range(1, K):
            for tx in range(1,K+1-d):#ty=tx+d<=K
                ty=tx+d #ty:도착점
                dp[tx][ty]=10001 #tx->ty까지 최소비용 10001로 초기화

                for mid in range(tx, ty):
                    #tx->ty 까지 도달하는데 최소비용을 구한다.
                    #dp[tx][ty], dp[tx][mid]+dp[mid+1][ty] +s[ty]+s[tx-1]
                    # dp[tx][mid]: tx->mid까지의 최소비용
                    # dp[mid+1][ty]: mid+1-> ty까지의 최소비용
                    dp[tx][ty]=min(dp[tx][ty], dp[tx][mid]+dp[mid+1][ty]+s[ty]-s[tx-1])
                    
        print(dp[1][K])#1부터 K까지 최소비용
        

if __name__=='__main__':
    main()

[java]

import java.util.Scanner;
public class Main{
	//최대 500개..
	static int dp[][];
	static int sum[];
	static int cost[];
	public static void main(String[] args) {
		Scanner sc= new Scanner(System.in);
		int T= sc.nextInt();
		int K;
		for(int t=0; t<T; t++) 
		{
			//K입력(K: 소설을 구성하는 장의 수)
			K=sc.nextInt();
			
			//초기화
			dp= new int[501][501];
			sum= new int[501];
			cost= new int[501];
			for(int i=0; i<K; i++)
				cost[i]=sc.nextInt();
			
			//0부터 0까지의 합
			sum[0]=cost[0];
			
			//0부터 i까지의 합
			for(int i=1; i<K; i++)
				sum[i]+=sum[i-1]+cost[i];
			
			//초기값저장
			for(int i=0; i<K-1; i++)
				dp[i][i+1]=cost[i]+cost[i+1];
			
			for(int gap=2; gap<K; gap++)//i와 j간 gap이 3이상일때 
			{
				for(int i=0; i+gap<K; i++) 
				{
					int j=i+gap;
					dp[i][j]=Integer.MAX_VALUE; //무한대
					
					for(int mid=i; mid<j; mid++)//i~j 사이의 k값
						dp[i][j]=Math.min(dp[i][j], dp[i][mid]+dp[mid+1][j]+sum(sum,i,j));
				}
			}
			System.out.println(dp[0][K-1]);
		}
	}
	
	public static int sum(int sum[], int i, int j) 
	{
		if(i==0)
			return sum[j];
		else
			return sum[j]-sum[i-1];
	}
}
728x90
반응형

'알고리즘 > BOJ' 카테고리의 다른 글

[BOJ-2146] 다리만들기  (0) 2020.03.03
[BOJ-2606] 바이러스  (0) 2020.03.02
[BOJ-2206] 벽부수고 이동하기  (0) 2020.03.01
[BOJ-2178] 미로탐색  (0) 2020.03.01
[BOJ-1520]내리막길  (0) 2020.03.01
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함