일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- algorithm
- 운영체제
- 데이터베이스
- data structure
- Database
- 프로그래머스
- db
- 백준
- 재테크/투자
- swea
- 법의학
- 문제풀이
- 자료구조
- SW Expert Academy
- D3
- Programmers
- 독서
- BOJ
- D2
- c++
- OS
- cs
- 감상문
- language
- algogritim
- network
- 네트워크
- LeetCode
- Computer Science
- 알고리즘
Archives
- Today
- Total
선택은 나의 것
[BOJ 백준] 1715번 카드 정렬하기 본문
문제
BOJ 1715 : https://www.acmicpc.net/problem/1715
1715번: 카드 정렬하기
정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장��
www.acmicpc.net
접근
카드를 합칠 때 적은 수의 카드 묶음을 합쳐나가는 방식이 최소 비교 횟수이다. 따라서 오름차순으로 정렬된 우선순위 큐에 카드 묶음들을 넣어준 다음 top에 있는 두 카드 묶음을 합쳐주면 자연스레 작은 수의 카드 묶음을 더해나갈 수 있다. 이때 두 개의 카드 묶음을 합쳐서 만들어지는 새로운 카드 묶음을 다시 큐에 넣어주는 것을 잊지 말자. 이렇게 진행하다 보면 모든 카드가 합쳐져서 큐의 size가 1이 되는 시점이 오면 while문을 종료하고 답을 출력해준다.
코드
#include <iostream>
#include <queue>
using namespace std;
int main() {
int n, temp, answer = 0;
cin >> n;
priority_queue<int, vector<int>, greater<int>> pq;
for (int i = 0; i < n; i++) {
cin >> temp;
pq.push(temp);
}
while (pq.size() != 1) {
int a = pq.top();
pq.pop();
int b = pq.top();
pq.pop();
answer += a + b;
pq.push(a + b);
}
cout << answer;
return 0;
}
'☽ Algorithm > BOJ' 카테고리의 다른 글
[BOJ 백준] 2890번 카약 (0) | 2020.06.24 |
---|---|
[BOJ 백준] 1439번 뒤집기 (0) | 2020.06.24 |
[BOJ 백준] 1700번 멀티탭 스케줄링 (0) | 2020.06.10 |
[BOJ 백준] 2230번 수 고르기 (0) | 2020.06.03 |
[BOJ 백준] 1713번 후보 추천하기 (0) | 2020.06.01 |
Comments