[Baekjoon Online Judge] 백준 1715번 카드 정렬하기
(C++, Python)
(글쓴날 : 2020.04.27)
* Baekjoon Online Judge, 백준 1715번 문제 C++, Python 언어 풀이입니다.
* 소스 코드의 저작권은 글쓴이에게 있습니다.
백준 1715번 카드 정렬하기
1) 문제
문제 링크 : https://www.acmicpc.net/problem/1715
1715번: 카드 정렬하기
정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장의 숫자 카드 묶음을 합치려면 50번의 비교가 필요하다. 매우 많은 숫자 카드 묶음이 책상 위에 놓여 있다. 이들을 두 묶음씩 골라 서로 합쳐나간다면, 고르는 순서에 따라서 비교 횟수가 매우 달라진다. 예를 들어 10장, 20장, 40장의 묶음이 있다면
www.acmicpc.net
2) 풀이 과정
* 시간 복잡도 : O(n log n)
N개의 정렬된 숫자 카드 묶음이 주어지고, 각 숫자 카드들을 모두 하나로 합칠 때 최소 비교 횟수를 구하는 문제입니다.
저의 경우, 우선순위 큐를 적용하였으며, C++과 Python을 사용했습니다.
처음에 문제를 제대로 이해하지 못해서 헷갈렸던 부분이 있었는데, 문제의 목적이 비교 횟수를 구하는 것이므로 만약 N이 1일 경우 답은 0이 되는 것과, 비교할 카드 묶음의 개수가 항상 최소여야 한다는 것입니다.
예를 들어, 10개인 카드 묶음이 5개(10, 10, 10, 10, 10) 주어진다면, (10+10) + (20+10) + (30+10) = 90이 아니라 (10+10)+(10+10)+(20+20) = 80이 되어야 합니다.
따라서, 카드 묶음을 합치기 전에 매번 개수가 가장 적은 카드 묶음을 골라야 하므로, Min Heap 기반의 우선순위 큐를 적용하였고, 합쳐서 하나로 만든 카드 묶음을 다시 우선순위 큐에 집어넣는 식으로 비교 횟수가 항상 최소가 되도록 하여 문제를 해결했습니다.
3) 코드
* C++ 코드
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
32
33
34
35
36
37
38
39
40
41
42
43
|
#include <iostream>
#include <queue>
#include <vector>
#include <functional>
using namespace std;
int main(void)
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int N = 0;
cin >> N;
priority_queue<int, vector<int>, greater<int>> pq;
int inputValue = 0;
for (int i = 0; i < N; i++)
{
cin >> inputValue;
pq.push(inputValue);
}
int minCompareCount = 0;
int compareCountA = 0;
int compareCountB = 0;
for (int i = 0; i < N - 1; i++)
{
compareCountA = pq.top();
pq.pop();
compareCountB = pq.top();
pq.pop();
pq.push(compareCountA + compareCountB);
minCompareCount += compareCountA + compareCountB;
}
cout << minCompareCount;
return 0;
}
|
* Python 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import sys, heapq
input = sys.stdin.readline
N = int(input())
hq = []
minCompareCount = 0
for _ in range(N):
heapq.heappush(hq, int(input()))
for _ in range(N - 1):
compareCountA = heapq.heappop(hq)
compareCountB = heapq.heappop(hq)
heapq.heappush(hq, compareCountA + compareCountB)
minCompareCount += compareCountA + compareCountB
print(minCompareCount)
|
'Deprecated' 카테고리의 다른 글
[ALGOSPOT] 알고스팟 LUNCHBOX Microwaving Lunch Boxes(C++, Python) (0) | 2020.04.29 |
---|---|
[Baekjoon Online Judge] 백준 1655번 가운데를 말해요(C++, Python) (0) | 2020.04.27 |
[Baekjoon Online Judge] 백준 11286번 절댓값 힙(C++, Python) (0) | 2020.04.26 |
[Python] heapq 사용법 (0) | 2020.04.26 |
[C++] priority_queue 사용법 (0) | 2020.04.26 |