티스토리 뷰
https://www.acmicpc.net/problem/11066
11066번: 파일 합치기
소설가인 김대전은 소설을 여러 장(chapter)으로 나누어 쓰는데, 각 장은 각각 다른 파일에 저장하곤 한다. 소설의 모든 장을 쓰고 나서는 각 장이 쓰여진 파일을 합쳐서 최종적으로 소설의 완성본
www.acmicpc.net
보자마자 생각난 건 분할 정복이었다..!!!!
예전에 어떤 문제에서 풀은 방식이었던 것 같은데(무슨 문제였는지 기억은 안남..)
i장부터 j장까지의 파일을 합쳤을 때의 최소를 구하여
1장부터 K장까지의 최소를 구하는 방식으로 풀이했다. (값들은 재귀 방식으로 구해짐)
(챕터 수의 최대가 500이었고 이는 널널하게 계산 가능할거란 생각이 들어 전수 조사를 하게 되었다.)
주의할 점
범위의 최소값을 저장하는 과정에서
저장될 수 있는 최대값 MAXFILE이 500(챕터 수)*10000(파일의크기) 일거라고 생각하였다.
하지만 파일을 합하는 비용은 중첩되어 계산되므로 이 기준값은 잘못된 것이다..
따라서 널널하게 1000000000으로 재설정해주었다..
import java.io.*;
import java.util.Arrays;
public class Main {
static int[][] min;
static final int MAXFILE = 1000000000;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String line = br.readLine();
int T = Integer.valueOf(line);
for (int cnt = 0; cnt < T; cnt++) {
//chapter 수
int K = Integer.valueOf(br.readLine());
line = br.readLine();
min = new int[K + 1][K + 1]; //해당 범위에서의 최소값 저장
int[] size = Arrays.stream(line.split(" "))
.mapToInt(Integer::parseInt).toArray();
for (int i = 0; i < size.length; i++) {
min[i + 1][i + 1] = size[i];
}
mergeFiles(1, K);
bw.write(String.valueOf(min[1][K]) + "\n");
}
bw.flush();
bw.close();
}
private static void mergeFiles(int beginF, int endF) {
int comp=0;
int minSum = MAXFILE;
for (int mid = beginF; mid < endF; mid++) {
min[beginF][endF] += min[mid][mid];
if (min[beginF][mid] == 0)
mergeFiles(beginF, mid);
if (min[mid + 1][endF] == 0)
mergeFiles(mid + 1, endF);
if (mid == beginF && mid == endF - 1) {
comp = 0;
}else if(mid==beginF || mid==endF-1){
if(mid == beginF){
comp = min[mid + 1][endF];
} else if (mid == endF - 1) {
comp = min[beginF][mid];
}
} else {
comp = min[beginF][mid] + min[mid + 1][endF];
}
minSum = (minSum > comp) ? (comp) : minSum;
}
min[beginF][endF] += (min[endF][endF] + minSum);
}
}
'알고리즘 > 코테' 카테고리의 다른 글
[백준 17386] 선분 교차 1 (0) | 2022.03.08 |
---|---|
[백준 1167] 트리의 지름 (0) | 2022.03.03 |
[백준 2933] 미네랄 (0) | 2022.02.28 |
[백준 2749] 피보나치 수 3 (0) | 2022.02.21 |
[백준 10830] 행렬 제곱 (0) | 2022.02.08 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Segment Tree
- Greedy
- 부분 합
- LowerBound
- 완전 탐색
- 페르마의 정리
- 백트래킹
- 배낭 문제
- 비트마스킹
- 이분탐색
- MaxHeap
- 위상 정렬
- 누적 합
- 완전탐색
- 구간 합
- Knapsack
- dp
- 최단 거리
- 참조 지역성
- Priority Queue
- 분할정복
- RequiredArgsConstructor
- HashSet
- 희소 배열
- prirotyqueue
- 분할 정복
- MinHeap
- Sort
- 동적계획법
- dfs
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함