Skip to content

Commit f6d13ad

Browse files
committed
[Silver III] Title: 알고리즘 수업 - 병합 정렬 1, Time: 372 ms, Memory: 117188 KB -BaekjoonHub
1 parent 6b4d92f commit f6d13ad

File tree

2 files changed

+139
-0
lines changed

2 files changed

+139
-0
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# [Silver III] 알고리즘 수업 - 병합 정렬 1 - 24060
2+
3+
[문제 링크](https://www.acmicpc.net/problem/24060)
4+
5+
### 성능 요약
6+
7+
메모리: 117188 KB, 시간: 372 ms
8+
9+
### 분류
10+
11+
구현, 재귀, 정렬
12+
13+
### 제출 일자
14+
15+
2025년 1월 4일 23:03:05
16+
17+
### 문제 설명
18+
19+
<p>오늘도 서준이는 병합 정렬 수업 조교를 하고 있다. 아빠가 수업한 내용을 학생들이 잘 이해했는지 문제를 통해서 확인해보자.</p>
20+
21+
<p><em>N</em>개의 서로 다른 양의 정수가 저장된 배열 A가 있다. 병합 정렬로 배열 A를 오름차순 정렬할 경우 배열 A에 <em>K </em>번째 저장되는 수를 구해서 우리 서준이를 도와주자.</p>
22+
23+
<p>크기가 <em>N</em>인 배열에 대한 병합 정렬 의사 코드는 다음과 같다.</p>
24+
25+
<pre>merge_sort(A[p..r]) { # A[p..r]을 오름차순 정렬한다.
26+
if (p < r) then {
27+
q <- ⌊(p + r) / 2⌋; # q는 p, r의 중간 지점
28+
merge_sort(A, p, q); # 전반부 정렬
29+
merge_sort(A, q + 1, r); # 후반부 정렬
30+
merge(A, p, q, r); # 병합
31+
}
32+
}
33+
34+
# A[p..q]와 A[q+1..r]을 병합하여 A[p..r]을 오름차순 정렬된 상태로 만든다.
35+
# A[p..q]와 A[q+1..r]은 이미 오름차순으로 정렬되어 있다.
36+
merge(A[], p, q, r) {
37+
i <- p; j <- q + 1; t <- 1;
38+
while (i ≤ q and j ≤ r) {
39+
if (A[i] ≤ A[j])
40+
then tmp[t++] <- A[i++]; # tmp[t] <- A[i]; t++; i++;
41+
else tmp[t++] <- A[j++]; # tmp[t] <- A[j]; t++; j++;
42+
}
43+
while (i ≤ q) # 왼쪽 배열 부분이 남은 경우
44+
tmp[t++] <- A[i++];
45+
while (j ≤ r) # 오른쪽 배열 부분이 남은 경우
46+
tmp[t++] <- A[j++];
47+
i <- p; t <- 1;
48+
while (i ≤ r) # 결과를 A[p..r]에 저장
49+
A[i++] <- tmp[t++];
50+
}</pre>
51+
52+
### 입력
53+
54+
<p>첫째 줄에 배열 A의 크기 <em>N</em>(5 ≤ <em>N</em> ≤ 500,000), 저장 횟수 <em>K</em>(1 ≤ <em>K</em> ≤ 10<sup>8</sup>)가 주어진다.</p>
55+
56+
<p>다음 줄에 서로 다른 배열 A의 원소 A<sub>1</sub>, A<sub>2</sub>, ..., A<sub>N</sub>이 주어진다. (1 ≤ A<sub>i</sub> ≤ 10<sup>9</sup>)</p>
57+
58+
### 출력
59+
60+
<p>배열 A에 <em>K </em>번째 저장 되는 수를 출력한다. 저장 횟수가 <em>K </em>보다 작으면 -1을 출력한다.</p>
61+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import Foundation
2+
3+
//merge_sort(A[p..r]) { # A[p..r]을 오름차순 정렬한다.
4+
// if (p < r) then {
5+
// q <- ⌊(p + r) / 2⌋; # q는 p, r의 중간 지점
6+
// merge_sort(A, p, q); # 전반부 정렬
7+
// merge_sort(A, q + 1, r); # 후반부 정렬
8+
// merge(A, p, q, r); # 병합
9+
// }
10+
//}
11+
var saved = 0
12+
func merge_sort( _ collection: inout [Int], _ p: Int, _ r: Int) -> Bool {
13+
if p < r {
14+
let q = Int(floor(Double(p+r) / 2.0))
15+
if merge_sort(&collection, p, q) { return true }
16+
if merge_sort(&collection, q+1, r) { return true }
17+
if merge(&collection, p: p, q: q, r: r) { return true }
18+
}
19+
return false
20+
}
21+
22+
//
23+
//# A[p..q]와 A[q+1..r]을 병합하여 A[p..r]을 오름차순 정렬된 상태로 만든다.
24+
//# A[p..q]와 A[q+1..r]은 이미 오름차순으로 정렬되어 있다.
25+
//merge(A[], p, q, r) {
26+
// i <- p; j <- q + 1; t <- 1;
27+
// while (i ≤ q and j ≤ r) {
28+
// if (A[i] ≤ A[j])
29+
// then tmp[t++] <- A[i++]; # tmp[t] <- A[i]; t++; i++;
30+
// else tmp[t++] <- A[j++]; # tmp[t] <- A[j]; t++; j++;
31+
// }
32+
// while (i ≤ q) # 왼쪽 배열 부분이 남은 경우
33+
// tmp[t++] <- A[i++];
34+
// while (j ≤ r) # 오른쪽 배열 부분이 남은 경우
35+
// tmp[t++] <- A[j++];
36+
// i <- p; t <- 1;
37+
// while (i ≤ r) # 결과를 A[p..r]에 저장
38+
// A[i++] <- tmp[t++];
39+
//}
40+
//p = 0, q = 0, r = 1
41+
func merge(_ collection: inout [Int], p: Int, q: Int, r: Int) -> Bool{
42+
var tmp: [Int] = []
43+
var i = p, j = q+1
44+
while i <= q && j <= r {
45+
if collection[i] <= collection[j] {
46+
tmp.append(collection[i])
47+
i += 1
48+
} else {
49+
tmp.append(collection[j])
50+
j += 1
51+
}
52+
}
53+
while i <= q {
54+
tmp.append(collection[i])
55+
i += 1
56+
}
57+
while j <= r {
58+
tmp.append(collection[j])
59+
j += 1
60+
}
61+
i = p
62+
for element in tmp {
63+
saved += 1
64+
if saved == ak[1] {
65+
print("\(element)")
66+
return true
67+
}
68+
collection[i] = element
69+
i += 1
70+
}
71+
return false
72+
}
73+
74+
var ak = readLine()!.split{ $0 == " " }.map { Int(String($0))! }
75+
var collection = readLine()!.split{ $0 == " " }.map { Int(String($0))! }
76+
if !merge_sort(&collection, 0, ak[0]-1) {
77+
print("-1")
78+
}

0 commit comments

Comments
 (0)