[ 문제 ] : https://www.acmicpc.net/problem/1715
1715번: 카드 정렬하기
정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장
www.acmicpc.net
[ 문제 접근 ]
우선 정렬하고 앞에서부터 하나씩 더해 나가면 될거라고 판단해서 그대로 구현했다가 틀렸다.
그러고 생각해보니 30 40 50 60 <- 내 코드의 반례가 된다.
30과 40을 더했을 때 나오는 70을 남은 수 50 과 60과 비교하여 작은 수부터 더해줘야하는것이다.
이 경우, 우선순위 큐를 사용하여 자동으로 정렬되게끔 하면 해결된다.
[ 처음 코드 ]
#include<iostream> #include<vector> #include<string> #include<algorithm> using std::cout; using std::cin; using std::vector; using std::string; int N; int card[100001]; vector<int> answer; int real_answer; int main() { std::ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> N; for (int i = 0; i < N; i++) { cin >> card[i]; } std::sort(card, card + N); int temp = card[0]; for (int i = 1; i < N; i++) { temp += card[i]; answer.push_back(temp); } for (auto& elem : answer)real_answer += elem; cout << real_answer; return 0; }
[ 최종 코드 ]
#include<iostream> #include<vector> #include<algorithm> #include<queue> using std::cout; using std::cin; using std::vector; int N; std::priority_queue<int,vector<int>,std::greater<int>> pq; int main() { std::ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> N; for (int i = 0; i < N; i++) { int a; cin >> a; pq.push(a); } int answer = 0; while (pq.size() != 1) { int x = pq.top(); // 첫번째 pq.pop(); int y = pq.top(); // 두번째 pq.pop(); answer += (x + y); pq.push(x + y); } cout << answer; return 0; }
'PS > BaekJoon' 카테고리의 다른 글
[1946] 신입 사원 - 정렬 ★★☆☆ / 복습 ○ (0) | 2021.12.22 |
---|---|
[9935] 문자열 폭발 - 문자열/Stack ★★★☆ / 복습 ○ (0) | 2021.12.16 |
[2002] 추월 - 해쉬 ★★☆☆ / 복습 ○ (0) | 2021.12.16 |
[15652] N과 M(4) - 중복 조합 ★★☆☆ / 복습 ○ (0) | 2021.12.11 |
[15651] N과 M(3) - 중복 순열 ★★☆☆ / 복습 ○ (0) | 2021.12.11 |