개인공부용123 프로그래밍 블로그

AlgoSpot) STRJOIN 본문

알고리즘문제

AlgoSpot) STRJOIN

개인공부용123 2017. 1. 16. 23:04

문제 : https://algospot.com/judge/problem/read/STRJOIN


문자를 합쳐서 나오는 최소비용을 구하는 문제인데 이 무제는 가장 작은 값2개를 계속 더해나갔을 경우

가장 최소의 비용을 가질수 있습니다. 

즉 탐욕법을 적용해서 문제를 풀면 풀 수 있습니다.


priority_queue를 이용하는 방법과 매 시행마다 sort를 이용하는 방법을 2가지를 이용해서 문제를 풀었습니다.


#include <iostream> #include <queue> #include <vector> #include <functional> // min힙을 사용하기위해 greater를 호출하는데 사용됨 #include <algorithm>

using namespace std; #define IMPOS 999999 vector arr; int StrJoin(int n) { int MinPrice = 0; for (int i = 0; i < n - 1; ++i) { MinPrice += arr[0] + arr[1]; arr[0] += arr[1]; arr[1] = IMPOS; sort(arr.begin(), arr.end()); } return MinPrice; } int StrJoin_Using_Priority_Queue(int n) { int MinPrice = 0; int Merger; priority_queue, greater> pq; // min 힙생성 for (int i = 0; i < n; ++i) pq.push(arr[i]); for (int i = 0; i < n - 1; ++i) { Merger = 0; Merger += pq.top(); pq.pop(); Merger += pq.top(); pq.pop(); pq.push(Merger); MinPrice += Merger; } return MinPrice; } int main() { std::ios::sync_with_stdio(false); int C, n , num; cin >> C; while (C--) { cin >> n; num = 0; for (int i = 0; i < n; ++i) { cin >> num; arr.push_back(num); } sort(arr.begin(), arr.end()); //cout << StrJoin(n) << endl; cout << StrJoin_Using_Priority_Queue(n) << endl; arr.clear(); } }


'알고리즘문제' 카테고리의 다른 글

AlgoSpot) ALLERGY  (0) 2017.01.22
AlgoSpot) QUADTREE  (1) 2017.01.21
AlgoSpot) LUNCHBOX  (12) 2017.01.14
AlgoSpot) MATCHORDER  (0) 2017.01.14
AlgoSpot) SUSHI  (0) 2017.01.12