HelloMinchan
처음처럼
HelloMinchan
LinkedIn
전체 방문자
오늘
어제
  • 분류 전체보기 (306)
    • Backend (4)
      • NestJS (1)
      • Express (1)
      • Spring (2)
    • Infrastructure (1)
      • AWS (1)
    • Frontend (1)
      • Next.js (1)
    • Language & Runtime (4)
      • Java (2)
      • Node.js (2)
    • Computer Science (8)
      • Computer Networks (3)
      • Operating Systems (4)
      • OOP (1)
    • 독서 (4)
      • 데이터 중심 애플리케이션 설계 (3)
      • 객체지향의 사실과 오해 (1)
    • 회고 (4)
      • Project (2)
      • Career (2)
    • Deprecated (280)

채널

  • GitHub
  • LinkedIn

최근 글

태그

  • 개발자
  • back-end
  • 알고스팟Python
  • 백준C++
  • Algospot
  • Baekjoon Online Judge
  • 알고스팟
  • front-end
  • 데이터베이스
  • 백엔드
  • 백준Python
  • 프로그래밍
  • 백준
  • 프로그래머스C++
  • programmers
  • Database
  • 프로그래머스
  • 프로그래머스Python
  • 코딩
  • 백준Go

최근 댓글

인기 글

hELLO
HelloMinchan

처음처럼

[Baekjoon Online Judge] 백준 1715번 카드 정렬하기(C++, Python)
Deprecated

[Baekjoon Online Judge] 백준 1715번 카드 정렬하기(C++, Python)

2020. 4. 27. 12:43

© 2020 All Rights Reserved. 주식회사 스타트링크

[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
    'Deprecated' 카테고리의 다른 글
    • [ALGOSPOT] 알고스팟 LUNCHBOX Microwaving Lunch Boxes(C++, Python)
    • [Baekjoon Online Judge] 백준 1655번 가운데를 말해요(C++, Python)
    • [Baekjoon Online Judge] 백준 11286번 절댓값 힙(C++, Python)
    • [Python] heapq 사용법
    HelloMinchan
    HelloMinchan
    Though you should not fear failure, You should do your very best to avoid it.

    티스토리툴바