Skip to content

Commit 4e7e6f7

Browse files
committed
[Gold IV] Title: 파일 합치기 3, Time: 1888 ms, Memory: 113648 KB -BaekjoonHub
1 parent 613d9b8 commit 4e7e6f7

File tree

2 files changed

+116
-0
lines changed

2 files changed

+116
-0
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# [Gold IV] 파일 합치기 3 - 13975
2+
3+
[문제 링크](https://www.acmicpc.net/problem/13975)
4+
5+
### 성능 요약
6+
7+
메모리: 113648 KB, 시간: 1888 ms
8+
9+
### 분류
10+
11+
자료 구조, 그리디 알고리즘, 우선순위 큐
12+
13+
### 제출 일자
14+
15+
2026년 1월 31일 23:36:54
16+
17+
### 문제 설명
18+
19+
<p>소설가인 김대전은 소설을 여러 장(chapter)으로 나누어 쓰는데, 각 장은 각각 다른 파일에 저장하곤 한다. 소설의 모든 장을 쓰고 나서는 각 장이 쓰여진 파일을 합쳐서 최종적으로 소설의 완성본이 들어있는 한 개의 파일을 만든다. 이 과정에서 두 개의 파일을 합쳐서 하나의 임시파일을 만들고, 이 임시파일이나 원래의 파일을 계속 두 개씩 합쳐서 파일을 합쳐나가고, 최종적으로는 하나의 파일로 합친다. 두 개의 파일을 합칠 때 필요한 비용(시간 등)이 두 파일 크기의 합이라고 가정할 때, 최종적인 한 개의 파일을 완성하는데 필요한 비용의 총 합을 계산하시오.</p>
20+
21+
<p>예를 들어, C1, C2, C3, C4가 네 개의 장을 수록하고 있는 파일이고, 파일 크기가 각각 40, 30, 30, 50 이라고 하자. 이 파일들을 합치는 과정에서, 먼저 C2와 C3를 합쳐서 임시파일 X1을 만든다. 이때 비용 60이 필요하다. 그 다음으로 C1과 X1을 합쳐 임시파일 X2를 만들면 비용 100이 필요하다. 최종적으로 X2와 C4를 합쳐 최종파일을 만들면 비용 150이 필요하다. 따라서, 최종의 한 파일을 만드는데 필요한 비용의 합은 60+100+150=310 이다. 다른 방법으로 파일을 합치면 비용을 줄일 수 있다. 먼저 C1과 C2를 합쳐 임시파일 Y1을 만들고, C3와 C4를 합쳐 임시파일 Y2를 만들고, 최종적으로 Y1과 Y2를 합쳐 최종파일을 만들 수 있다. 이때 필요한 총 비용은 70+80+150=300 이다.</p>
22+
23+
<p>소설의 각 장들이 수록되어 있는 파일의 크기가 주어졌을 때, 이 파일들을 하나의 파일로 합칠 때 필요한 최소비용을 계산하는 프로그램을 작성하시오.</p>
24+
25+
### 입력
26+
27+
<p>프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T개의 테스트 데이터로 이루어져 있는데, T는 입력의 맨 첫 줄에 주어진다.각 테스트 데이터는 두 개의 행으로 주어지는데, 첫 행에는 소설을 구성하는 장의 수를 나타내는 양의 정수 K (3 ≤ K ≤ 1,000,000)가 주어진다. 두 번째 행에는 1장부터 K장까지 수록한 파일의 크기를 나타내는 양의 정수 K개가 주어진다. 파일의 크기는 10,000을 초과하지 않는다.</p>
28+
29+
### 출력
30+
31+
<p>프로그램은 표준 출력에 출력한다. 각 테스트 데이터마다 정확히 한 행에 출력하는데, 모든 장을 합치는데 필요한 최소비용을 출력한다.</p>
32+
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import Foundation
2+
3+
final class FastScanner {
4+
private var data = Array(FileHandle.standardInput.readDataToEndOfFile()) + [0]
5+
private var idx = 0
6+
7+
func readInt() -> Int {
8+
var num = 0
9+
while data[idx] == 10 || data[idx] == 32 { idx += 1 }
10+
while data[idx] >= 48 {
11+
num = num * 10 + Int(data[idx] - 48)
12+
idx += 1
13+
}
14+
return num
15+
}
16+
}
17+
18+
let scanner = FastScanner()
19+
let T = scanner.readInt()
20+
21+
var output = ""
22+
23+
for _ in 0..<T {
24+
let K = scanner.readInt()
25+
let heap = MinHeap()
26+
27+
for _ in 0..<K {
28+
heap.push(scanner.readInt())
29+
}
30+
31+
var total = 0
32+
33+
while heap.count > 1 {
34+
let a = heap.pop()
35+
let b = heap.pop()
36+
let s = a + b
37+
total += s
38+
heap.push(s)
39+
}
40+
41+
output += "\(total)\n"
42+
}
43+
44+
print(output)
45+
46+
final class MinHeap {
47+
private var heap: [Int] = []
48+
49+
var isEmpty: Bool { heap.isEmpty }
50+
var count: Int { heap.count }
51+
52+
func push(_ x: Int) {
53+
heap.append(x)
54+
var i = heap.count - 1
55+
while i > 0 {
56+
let p = (i - 1) / 2
57+
if heap[p] <= heap[i] { break }
58+
heap.swapAt(p, i)
59+
i = p
60+
}
61+
}
62+
63+
func pop() -> Int {
64+
let res = heap[0]
65+
let last = heap.removeLast()
66+
if !heap.isEmpty {
67+
heap[0] = last
68+
var i = 0
69+
while true {
70+
let l = i * 2 + 1
71+
let r = l + 1
72+
if l >= heap.count { break }
73+
var m = l
74+
if r < heap.count && heap[r] < heap[l] {
75+
m = r
76+
}
77+
if heap[i] <= heap[m] { break }
78+
heap.swapAt(i, m)
79+
i = m
80+
}
81+
}
82+
return res
83+
}
84+
}

0 commit comments

Comments
 (0)