알고리즘 공부/C++
[G4] 백준 13975번 파일 합치기 3 C++ 그리디 알고리즘, 우선순위 큐
마달랭
2025. 7. 13. 19:18
리뷰
https://www.acmicpc.net/problem/13975
최적해가 빨리 떠오르는 문제, 실행 시간이 꽤나 큰편인데 다른 최적해가 추가로 있는듯 하다.
(+추가) 멀티셋을 사용한 풀이가 궁금하여 구현 후 제출했는데 시간 초과가 발생했다.
전역 변수
- t : 테스트 케이스의 개수를 저장할 변수
- n : 소설을 구성하는 장의 수를 저장할 변수
함수
없음
문제풀이
- t에 값을 입력 받고, t번의 테스트 케이스를 개행해 준다.
- 각 테스트 케이스 마다 변수 n에 값을 입력 받고, 정수를 오름차순으로 정렬할 우선순위 큐 pq를 초기화 한다.
- n개의 초기 요소를 입력 받아 pq에 push해준다.
- 변수 ans를 0으로 초기화 하고, 무한 루프를 수행해 준다.
- 변수 n1에 pq의 top요소를 저장하고 pq의 요소를 제거한다. 변수 n2에 한번 더 해당 로직을 수행해 준다.
- ans에 n1+n2를 더해주고, pq가 비었다면 break를, 아니라면 n1+n2를 pq에 push해준다.
- 기저 조건에 도달하여 무한 루프가 종료 되었을때 ans에 저장된 값을 출력 후 개행문자를 삽입해 준다.
트러블 슈팅
없음
참고 사항
- K의 범위가 최대 100만이고, 파일의 크기는 최대 1만이므로 int범위를 초과할 수 있다.
- 가장 작은 두 수를 합쳐주고, 합친 값을 다시 pq에 삽입해 주는 방식으로 풀이하였다.
정답 코드
#include<iostream>
#include<queue>
#define ll long long
using namespace std;
int t, n;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> t;
while (t--) {
cin >> n;
priority_queue<ll, vector<ll>, greater<ll>> pq;
for (int i = 0; i < n; ++i) {
int a; cin >> a;
pq.push(a);
}
ll ans = 0;
while (1) {
ll n1 = pq.top(); pq.pop();
ll n2 = pq.top(); pq.pop();
ans += n1 + n2;
if (pq.empty()) break;
pq.push(n1 + n2);
}
cout << ans << "\n";
}
}
728x90