[백준 1744번 C/C++] 수 묶기
[백준 1744번 C/C++] 수 묶기

https://www.acmicpc.net/problem/1744
1744번: 수 묶기
길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에
www.acmicpc.net
해결전략
탐욕법, 그리디 알고리즘 Greedy Algorithm
정렬
많은 분기 조건
정답 코드
#include <iostream> #include <vector> #include <algorithm> using namespace std; int n; long long answer; // 수열의 두 수를 묶었을 때 나올 수 있는 수열의 최대합 vector<int> negative, zero, positive; int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n; int input; for(int i = 0; i < n; i++){ cin >> input; if (input == 0) zero.push_back(input); else if (input < 0) negative.push_back(input); else if (input > 0) positive.push_back(input); } sort(negative.begin(), negative.end()); sort(positive.rbegin(), positive.rend()); if(negative.size() >= 2) { for (int i = 0; i < negative.size() - 1; i += 2) { answer += negative[i] * negative[i + 1]; } } if (positive.size() >= 2) { for (int i = 0; i < positive.size() - 1; i += 2) { answer += max(positive[i] * positive[i + 1], positive[i] + positive[i + 1]); } } if (zero.size() == 0){ // 0의 개수 == 0 if (negative.size() % 2 == 1) answer += negative[negative.size() - 1]; if (positive.size() % 2 == 1) answer += positive[positive.size() - 1]; cout << answer << "\n"; return 0; } if (zero.size() % 2 == 0){ // 0의 개수가 짝수 if (negative.size() % 2 == 1 && positive.size() % 2 == 1) { if (abs(negative[negative.size() - 1]) <= abs(positive[positive.size() - 1])) answer += negative[negative.size() - 1] + positive[positive.size() - 1]; // else에서는 negative[negative.size() - 1] * 0 + positive[positive.size() - 1] * 0 } else if (negative.size() % 2 == 1 && positive.size() % 2 == 0) { if (abs(negative[negative.size() - 1]) > positive[positive.size() - 1] * positive[positive.size() - 2]) answer -= positive[positive.size() - 1]; else answer += negative[negative.size() - 1]; } else if (negative.size() % 2 == 0 && positive.size() % 2 == 1) { answer += positive[positive.size() - 1]; } } else { // 0의 개수가 홀수 if (negative.size() % 2 == 1 && positive.size() % 2 == 1) { answer += negative[negative.size() - 1] * 0 + positive[positive.size() - 1]; } else if (negative.size() % 2 == 1 && positive.size() % 2 == 0) { answer += negative[negative.size() - 1] * 0; } else if (negative.size() % 2 == 0 && positive.size() % 2 == 1) { answer += positive[positive.size() - 1]; } } cout << answer << "\n"; return 0; }
다른 풀이
#include <iostream> #include <vector> #include <algorithm> using namespace std; int n; long long answer; // 수열의 두 수를 묶었을 때 나올 수 있는 수열의 최대합 vector<int> negative, positive; int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n; int input; for(int i = 0; i < n; i++){ cin >> input; if (input <= 0) negative.push_back(input); // 0과 음수를 negative 벡터에 넣음 else if (input > 1) positive.push_back(input); // 1보다 큰 수를 positive 벡터에 넣음 else answer += 1; // 1은 미리 더해줌 } sort(negative.begin(), negative.end()); // negative 벡터를 오름차순으로 정렬 sort(positive.rbegin(), positive.rend()); // positive 벡터를 내림차순으로 정렬 if(negative.size() % 2 == 1) { // negative 벡터의 크기가 홀수라면 answer += negative.back(); negative.pop_back(); } while(negative.size() >= 2) { // 음수 묶기 long long first = negative.back(); negative.pop_back(); long long second = negative.back(); negative.pop_back(); answer += first * second; } if(positive.size() % 2 == 1) { // positive 벡터의 크기가 홀수라면 answer += positive.back(); positive.pop_back(); } while(positive.size() >= 2) { // 양수 묶기 long long first = positive.back(); positive.pop_back(); long long second = positive.back(); positive.pop_back(); answer += first * second; } cout << answer << "\n"; return 0; }
'⭐ 코딩테스트 > 백준' 카테고리의 다른 글
[백준 1107번 C/C++] 리모컨 (0) | 2023.12.02 |
---|---|
[백준 10026번 C/C++] 적록색약 (0) | 2023.12.01 |
[백준 1339번 C/C++] 단어 수학 (1) | 2023.11.27 |
[백준 10830번 C/C++] 행렬 제곱 (0) | 2023.11.26 |
[백준 1715번 C/C++] 카드 정렬하기 (0) | 2023.11.20 |
댓글
이 글 공유하기
다른 글
-
[백준 1107번 C/C++] 리모컨
[백준 1107번 C/C++] 리모컨
2023.12.02 -
[백준 10026번 C/C++] 적록색약
[백준 10026번 C/C++] 적록색약
2023.12.01 -
[백준 1339번 C/C++] 단어 수학
[백준 1339번 C/C++] 단어 수학
2023.11.27 -
[백준 10830번 C/C++] 행렬 제곱
[백준 10830번 C/C++] 행렬 제곱
2023.11.26
댓글을 사용할 수 없습니다.