쉬운 그리디 문제였지만 조건문의 분기를 확실하게 해야한다. 또한 for문에서 인덱스 bound를 잘 생각해야한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
class Main {
static int[] arr;
static int ans = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(br.readLine());
}
// 오름차순으로 정리해준다
Arrays.sort(arr);
// 아래의 for 문에서는 음수 처리를 해줄 것이다
for (int i = 0; i < arr.length; i++) {
// 시작부터 0이상이면 바로 break
if (arr[i] >= 0) {
break;
}
// 2개씩 계산해줘야 하므로 인덱스 오류가 나지않게 마지막 인덱스값인지 아닌지 확인한다
if (i < arr.length - 1) {
// 음수는 둘다 음수거나, 각각 음수와 0 일때는 곱해야 한다
if (arr[i] < 0 && arr[i + 1] <= 0) {
ans += arr[i] * arr[i + 1];
i++;
// 위의 if 문의 조건식을 보자, 여기 걸리면 arr[i+1]은 양수값을 가지므로 break
} else if (arr[i] < 0) {
ans += arr[i];
break;
// 위의 if 문 모두 걸리지 않으면 시작부터 0이상이라는 말인데 혹시 몰라 예외처리 느낌으로 넣었다
} else {
break;
}
// i가 마지막 인덱스이면 그 값만 비교해야한다
// 이 for 문에서는 음수 값만 처리해주기로 했다
} else {
if (i == arr.length - 1 && arr[i] < 0) {
ans += arr[i];
break;
}
}
}
// 양수 값만 처리해주는 for 문이다
for (int i = arr.length - 1; i >= 0; i--) {
// 시작부터 0 이하면 break
if (arr[i] <= 0) {
break;
}
// 인덱스가 0일때는 그 다음 값과 생각 못하므로 분기한다
if (i > 0) {
// 둘다 1보다 크면 무조건 곱해야한다
if (arr[i] > 1 && arr[i - 1] > 1) {
ans += arr[i] * arr[i - 1];
i--;
// 위의 if 문과 비교해보자
// arr[i]가 1 초과라면 arr[i-1] == 1 이므로 각자 더해줘야한다
// arr[i] == 1 이라면 각자 더해줘야한다
} else if (arr[i] >= 1) {
ans += arr[i];
continue;
// 혹시 모를 예외처리
} else {
break;
}
// i 가 마지막 인덱스이면 그 값만 양수인지 확인하고 더해준다
} else {
if (i == 0 && arr[i] > 0) {
ans += arr[i];
break;
}
}
}
System.out.println(ans);
}
}