Skip to content

Commit 6af8cb6

Browse files
committed
[Silver I] Title: 카드 합체 놀이, Time: 0 ms, Memory: 2024 KB -BaekjoonHub
1 parent a452295 commit 6af8cb6

File tree

2 files changed

+78
-0
lines changed

2 files changed

+78
-0
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# [Silver I] 카드 합체 놀이 - 15903
2+
3+
[문제 링크](https://www.acmicpc.net/problem/15903)
4+
5+
### 성능 요약
6+
7+
메모리: 2024 KB, 시간: 0 ms
8+
9+
### 분류
10+
11+
자료 구조, 그리디 알고리즘, 우선순위 큐
12+
13+
### 제출 일자
14+
15+
2025년 4월 7일 09:39:56
16+
17+
### 문제 설명
18+
19+
<p>석환이는 아기다. 아기 석환이는 자연수가 쓰여져있는 카드를 갖고 다양한 놀이를 하며 노는 것을 좋아한다. 오늘 아기 석환이는 무슨 놀이를 하고 있을까? 바로 카드 합체 놀이이다!</p>
20+
21+
<p>아기 석환이는 자연수가 쓰여진 카드를 n장 갖고 있다. 처음에 i번 카드엔 a<sub>i</sub>가 쓰여있다. 카드 합체 놀이는 이 카드들을 합체하며 노는 놀이이다. 카드 합체는 다음과 같은 과정으로 이루어진다.</p>
22+
23+
<ol>
24+
<li>x번 카드와 y번 카드를 골라 그 두 장에 쓰여진 수를 더한 값을 계산한다. (x ≠ y)</li>
25+
<li>계산한 값을 x번 카드와 y번 카드 두 장 모두에 덮어 쓴다.</li>
26+
</ol>
27+
28+
<p>이 카드 합체를 총 m번 하면 놀이가 끝난다. m번의 합체를 모두 끝낸 뒤, n장의 카드에 쓰여있는 수를 모두 더한 값이 이 놀이의 점수가 된다. 이 점수를 가장 작게 만드는 것이 놀이의 목표이다.</p>
29+
30+
<p>아기 석환이는 수학을 좋아하긴 하지만, 아직 아기이기 때문에 점수를 얼마나 작게 만들 수 있는지를 알 수는 없었다(어른 석환이는 당연히 쉽게 알 수 있다). 그래서 문제 해결 능력이 뛰어난 여러분에게 도움을 요청했다. 만들 수 있는 가장 작은 점수를 계산하는 프로그램을 만들어보자.</p>
31+
32+
### 입력
33+
34+
<p>첫 번째 줄에 카드의 개수를 나타내는 수 n(2 ≤ n ≤ 1,000)과 카드 합체를 몇 번 하는지를 나타내는 수 m(0 ≤ m ≤ 15×n)이 주어진다.</p>
35+
36+
<p>두 번째 줄에 맨 처음 카드의 상태를 나타내는 n개의 자연수 a<sub>1</sub>, a<sub>2</sub>, …, a<sub>n</sub>이 공백으로 구분되어 주어진다. (1 ≤ a<sub>i</sub> ≤ 1,000,000)</p>
37+
38+
### 출력
39+
40+
<p>첫 번째 줄에 만들 수 있는 가장 작은 점수를 출력한다.</p>
41+
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#include <iostream>
2+
#include <queue>
3+
using namespace std;
4+
typedef long long ll;
5+
6+
int main() {
7+
priority_queue<ll, vector<ll>, greater<ll> > pq;
8+
9+
int N, M;
10+
cin >> N >> M;
11+
12+
for (int i = 0; i < N; i++) {
13+
ll input;
14+
cin >> input;
15+
pq.push(input);
16+
}
17+
18+
while (M--) {
19+
ll first = pq.top();
20+
pq.pop();
21+
ll second = pq.top();
22+
pq.pop();
23+
ll sum = first + second;
24+
pq.push(sum);
25+
pq.push(sum);
26+
}
27+
28+
ll ans = 0;
29+
while (!pq.empty()) {
30+
ans += pq.top();
31+
pq.pop();
32+
}
33+
34+
cout << ans << '\n';
35+
36+
return 0;
37+
}

0 commit comments

Comments
 (0)