문제
https://www.acmicpc.net/problem/1744
1744번: 수 묶기
길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에
www.acmicpc.net
풀이
양수끼리 곱해야 값이 커지고 음수끼리 곱해야 값이 커진다.
따라서 양수끼리 리스트에 넣고 음수끼리 리스트에 넣는다.
양수끼리 곱할때는 큰것부터 곱해야 하므로 내림차순으로 정렬하고 음수끼리 곱할때는 작은것 부터 곱해야 커지기 때문에 오름차순으로 정렬한다.
양수끼리 곱할때 주의해야 할 것은 1이다. 즉, 1과 양수를 곱하면 값이 그대로이기 때문에 이때는 곱하는 것보다는 더하는게 더 낫다.
코드
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
ArrayList<Integer> arr1 = new ArrayList<>();
ArrayList<Integer> arr2 = new ArrayList<>();
for(int i=0;i<n;i++) {
int num = Integer.parseInt(br.readLine());
if(num > 0) {
arr1.add(num);
}
else {
arr2.add(num);
}
}
Collections.sort(arr1, Collections.reverseOrder());
Collections.sort(arr2);
int sum = 0;
for(int i=0;i<arr1.size();i++) {
if(i < arr1.size()-1) {
int temp = arr1.get(i) * arr1.get(i+1);
if(temp > arr1.get(i)) {
sum += temp;
i++;
}
else {
sum += arr1.get(i);
}
}
else {
sum += arr1.get(i);
}
}
for(int i=0;i<arr2.size();i++) {
if(i < arr2.size()-1) {
int temp = arr2.get(i) * arr2.get(i+1);
sum += temp;
i++;
}
else {
sum += arr2.get(i);
}
}
System.out.print(sum);
}
}