문제 주소 : www.acmicpc.net/problem/1744
1744번: 수 묶기
길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에
www.acmicpc.net
문제 확인
특별한 알고리즘이 필요한 문제는 아닙니다.
곱셈의 특성을 이용하여 풀면 쉽게 풀 수 있습니다.
문제에서 고려해야 할 점은 3가지입니다.
- 곱셈은 큰 수 끼리 곱할수록 더욱 커집니다.
- 두 음수의 곱은 양수입니다.
- A X 1 = A 입니다. => A + 1 이 A X 1 보다 크므로 이 수는 묶지 않습니다.
풀이
1, 2번 특성을 이용하기 위해서는 수열이 정렬되어 있어야 합니다. 간단하게 std::sort를 이용하여 정렬을 해 줍니다.
정렬이 끝나면 0번째부터 음수끼리 묶어 양수를 만들어 내 더합니다. 이때 음수 또한 1번 특성을 고려하여 (0,1), (2,3)으로 차례대로 묶어가면 더욱 큰 수를 얻을 수 있습니다. 음수 계산 시 0을 포함하여 계산을 하여 홀로 남은 음수를 0과 곱하여 0으로 만들어 줍니다. 이 과정을 양수가 나올 때까지 반복합니다.
양수의 경우 1번 특성을 이용하기 위하여 n-1번째 부터 역순으로 묶습니다. 주의해야 할 점은 3번 특성을 고려하여 2 이상의 양수만 묶습니다.
위 과정이 끝나면 남은 수 들을 더합니다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#include <cstdio>
#include <algorithm>
int main() {
int n, ary[10000], ans=0;
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &ary[i]);
std::sort(ary, ary + n);//정렬
int i = 0, j = n-1;
while (i + 1 < n &&ary[i] <= 0 && ary[i + 1] <= 0) {//음수를 양수가 나올 때 까지 묶기
ans += ary[i] * ary[i + 1];
i += 2;
}
while (j > 0 &&ary[j] > 1 && ary[j - 1] > 1) {//2 이상의 양수 묶기
ans += ary[j] * ary[j - 1];
j -= 2;
}
while (i <= j) //남은 수들을 더함
ans += ary[i++];
printf("%d", n > 1 ? ans : ary[0]);
}
|
cs |
반응형
'알고리즘 문제 > [백준]' 카테고리의 다른 글
[백준] 2357 최솟값과 최댓값 (0) | 2020.12.17 |
---|---|
[백준] 10868 최솟값 (0) | 2020.12.15 |
[백준] 19236 청소년 상어 (0) | 2020.12.09 |
[백준] 16637 괄호 추가하기 (0) | 2020.12.05 |
[백준] 14500번: 테트로미노 (0) | 2020.12.05 |