https://www.acmicpc.net/problem/1744
1744번: 수 묶기
길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에
www.acmicpc.net
그리디 문제다.
수의 곱과 합으로 최대값을 찾는 문제이므로 정렬을 먼저 했다.
처음에는 정렬 후 큰 수부터 곱과 합의 크기를 비교하고 큰 쪽으로 결과 값에 더해주는 방식으로 했다.
이 때 곱이 크면 인덱스를 하나 더 줄여주고, 합이 크면 현재 인덱스의 값만 더한다.
(쓰다보니 필요 없는 부분인가 싶다)
간과한 점은 음수도 들어올 수 있다는 점이다.
음수의 경우 작은 음수끼리 곱할 수록 값이 커진다.
따라서 위의 과정에서 음수와의 계산을 해야할 경우 반복문을 멈추고
작은 음수부터 같은 과정을 반복한다.
#include <iostream>
#include <algorithm>
using namespace std;
int arr[50];
int main() {
// 입출력 속도를 단축시키기 위함
ios::sync_with_stdio(0);
cin.tie(0);
int n, i, j; cin >> n;
for (int i = 0; i < n; i++) cin >> arr[i];
sort(arr, arr + n);
int re = 0;
// 양수
for (i = n - 1; i > 0; i--) {
if (arr[i - 1] < 0) break;
// 수 묶기 여부
if (arr[i] * arr[i - 1] > arr[i] + arr[i - 1]) {
re += arr[i] * arr[i - 1];
i--;
}
else re += arr[i];
}
// 음수
for (j = 0; j < i; j++) {
// 수 묶기 여부
if (arr[j] * arr[j + 1] > arr[j] + arr[j + 1]) {
re += arr[j] * arr[j + 1];
j++;
}
else re += arr[j];
}
if (j == i) re += arr[j];
cout << re;
}

'Algorithm > Greedy' 카테고리의 다른 글
[C++] BOJ(백준) 2879 코딩은 예쁘게 (0) | 2023.07.31 |
---|---|
[C++] BOJ(백준) 7983 내일 할거야 (0) | 2023.07.24 |
[C++] BOJ(백준) 1092 배 (0) | 2023.02.21 |
[C++] BOJ(백준) 1082 방 번호 (0) | 2023.02.21 |
[C++] BOJ(백준) 1715 카드 정렬하기 (1) | 2023.02.15 |
https://www.acmicpc.net/problem/1744
1744번: 수 묶기
길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에
www.acmicpc.net
그리디 문제다.
수의 곱과 합으로 최대값을 찾는 문제이므로 정렬을 먼저 했다.
처음에는 정렬 후 큰 수부터 곱과 합의 크기를 비교하고 큰 쪽으로 결과 값에 더해주는 방식으로 했다.
이 때 곱이 크면 인덱스를 하나 더 줄여주고, 합이 크면 현재 인덱스의 값만 더한다.
(쓰다보니 필요 없는 부분인가 싶다)
간과한 점은 음수도 들어올 수 있다는 점이다.
음수의 경우 작은 음수끼리 곱할 수록 값이 커진다.
따라서 위의 과정에서 음수와의 계산을 해야할 경우 반복문을 멈추고
작은 음수부터 같은 과정을 반복한다.
#include <iostream>
#include <algorithm>
using namespace std;
int arr[50];
int main() {
// 입출력 속도를 단축시키기 위함
ios::sync_with_stdio(0);
cin.tie(0);
int n, i, j; cin >> n;
for (int i = 0; i < n; i++) cin >> arr[i];
sort(arr, arr + n);
int re = 0;
// 양수
for (i = n - 1; i > 0; i--) {
if (arr[i - 1] < 0) break;
// 수 묶기 여부
if (arr[i] * arr[i - 1] > arr[i] + arr[i - 1]) {
re += arr[i] * arr[i - 1];
i--;
}
else re += arr[i];
}
// 음수
for (j = 0; j < i; j++) {
// 수 묶기 여부
if (arr[j] * arr[j + 1] > arr[j] + arr[j + 1]) {
re += arr[j] * arr[j + 1];
j++;
}
else re += arr[j];
}
if (j == i) re += arr[j];
cout << re;
}

'Algorithm > Greedy' 카테고리의 다른 글
[C++] BOJ(백준) 2879 코딩은 예쁘게 (0) | 2023.07.31 |
---|---|
[C++] BOJ(백준) 7983 내일 할거야 (0) | 2023.07.24 |
[C++] BOJ(백준) 1092 배 (0) | 2023.02.21 |
[C++] BOJ(백준) 1082 방 번호 (0) | 2023.02.21 |
[C++] BOJ(백준) 1715 카드 정렬하기 (1) | 2023.02.15 |