이 문제는 -끼리는 가장 작은 값을 묶어야 가장 커진다.
+끼리는 가장 큰 값을 묶어야 가장 커진다.
0은 - 중에서 가장 큰 값이나 안묶으면 가장 크기 때문에 이 점을 생각하고 계산해야 한다.
-와 0끼리 계산하고 +는 +끼리 계산해야 된다.
즉 배열이 -3, -2, -1, 0, 1, 2, 3이 있다고 한다면
-와 0 계산하기
(-3 -2) + (-1 0) 이렇게 해야 가장 커진다
(-3 * -2) + -1 + 0 이라면 위에 식보다 작기 때문에 무조건 위처럼 계산해야 한다.
+값 계산하기
+값은 내림차순으로 정렬해서 계산하는 것이 편하다
3 2 1 이렇게 되니까
(3 * 2) + 1 이렇게 되어야 가장 큰 값이다.
주의할 점은 예제 입력 5번처럼
2
1
1
이렇게 주어졌을 때이다.
값은 2가 되야 하는데 위의 로직처럼 실행하면 1 * 1 = 1으로 답이 1이 나온다.
그러므로 두 수를 더했을 때와 곱했을 때의 최댓값을 sum에다가 더해주면 된다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
// minus and 0 list
List<Integer> list1 = new ArrayList<>();
// plus list
List<Integer> list2 = new ArrayList<>();
for(int i=0;i<n;i++){
int element = Integer.parseInt(br.readLine());
if(element <= 0){
list1.add(element);
} else{
list2.add(element);
}
}
Collections.sort(list1);
Collections.sort(list2, Collections.reverseOrder());
long sum = 0;
for(int i=0;i<list1.size();i+=2){
if(i == list1.size() - 1){
sum += list1.get(i);
} else{
sum += list1.get(i) * list1.get(i+1);
}
}
for(int i=0;i<list2.size();i+=2){
if(i == list2.size() - 1){
sum += list2.get(i);
} else{
sum += Math.max(list2.get(i) * list2.get(i+1), list2.get(i) + list2.get(i+1));
}
}
System.out.println(sum);
}
}