백준/그리디 알고리즘
1744 수 묶기
have a good time
2024. 7. 22. 21:50
입력값에서 음수랑, 양수를 따로 받는다.
예를 들어
-10 -5 -1 0 1 2 3 4 5
이런식으로 입력값이 있을 때
1) 양수는 양수 리스트에 담고, 내림차순 정렬
-> 5 4 3 2 1
2) 음수와 0은 음수리스트에 담고, 오름차순 정렬
-10 -5 -1 0
그런 다음에 맨 처음에 있는 값부터 다음수와 묶으면 된다.
즉 양수의 경우
-> 5 4 3 2 1
5*4 + 3*2 + 1 = 20 + 6 + 1 = 27
이 최대의 값이 되고,
음수의 경우
-10 -5 -1 0
(-10) * (-5) + (-1)*0 = 50 + 0 = 50
이 최대의 값이 된다.
0을 음수 리스트에 넣은 이유는,
음수가 홀수개 있을 경우 나머지 1개는 수를 묶을 수 없어서
음수 그대로 남게 되는데, 0을 곱해서 0으로 만들면 음수를 없앨 수 있다.
그리고 1의 경우는,
그냥 더하는 것이 최댓값을 만들 수 있다.
즉, 1 1이 있을 경우,
수를 묶으면 1*1 = 1 밖에 안 되지만,
묶지 않으면, 1+1=2 가 된다.
그래서 이 경우는 예외 처리해주면 된다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " " );
int N = Integer.parseInt(st.nextToken());
ArrayList<Integer> positive_number = new ArrayList<>();
ArrayList<Integer> negative_number = new ArrayList<>();
for(int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine(), " " );
int number = Integer.parseInt(st.nextToken());
if(number>0) {
positive_number.add(number);
}else {
negative_number.add(number);
}
}
// 내림차순
Collections.sort(positive_number, Collections.reverseOrder());
// 오름차순
Collections.sort(negative_number);
int result = 0;
int i = 0;
int size = positive_number.size();
while(i<size) {
if(i<size && i+1<size) {
int a= positive_number.get(i);
int b= positive_number.get(i+1);
if(a==1||b==1) {
result+=a;
result+=b;
}else {
result+=a*b;
}
}else {
int a= positive_number.get(i);
result+=a;
}
i+=2;
}
i=0;
size = negative_number.size();
while(i<size) {
if(i<size && i+1<size) {
int a= negative_number.get(i);
int b= negative_number.get(i+1);
result+=a*b;
}else {
int a= negative_number.get(i);
result+=a;
}
i+=2;
}
System.out.println(result);
}
}
