Skip to content

Commit 1c959b4

Browse files
committed
[Silver I] Title: 카드 합체 놀이, Time: 140 ms, Memory: 15472 KB -BaekjoonHub
1 parent 36093b4 commit 1c959b4

File tree

2 files changed

+76
-0
lines changed

2 files changed

+76
-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+
메모리: 15472 KB, 시간: 140 ms
8+
9+
### 분류
10+
11+
자료 구조, 그리디 알고리즘, 우선순위 큐
12+
13+
### 제출 일자
14+
15+
2025년 11월 24일 09:15:41
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: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class Main {
5+
6+
public static void main(String[] args) throws Exception {
7+
8+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
9+
10+
StringTokenizer st = new StringTokenizer(br.readLine());
11+
12+
int N= Integer.parseInt(st.nextToken());
13+
int M = Integer.parseInt(st.nextToken());
14+
15+
PriorityQueue<Long> pq = new PriorityQueue<>();
16+
17+
st = new StringTokenizer(br.readLine());
18+
for(int i =0; i<N; i++) {
19+
pq.add(Long.parseLong(st.nextToken()));
20+
}
21+
22+
for(int i =0; i<M; i++) {
23+
Long cur1 = pq.poll();
24+
Long cur2 = pq.poll();
25+
26+
pq.add(cur1+cur2);
27+
pq.add(cur1+cur2);
28+
}
29+
Long answer = 0L;
30+
while(!pq.isEmpty()) {
31+
answer+= pq.poll();
32+
}
33+
System.out.println(answer);
34+
}
35+
}

0 commit comments

Comments
 (0)