길이가 N인 수열이 주어졌을 때, 그 수열의 합 구하기.
안 묶는게 나을 수도 있겠음.
묶으면 “곱셈”을 하게되니.. 0 뿐만 아니라 “음수” 와 “엄청 큰 양수”를 곱하면, 합을 매우 많이 감소시킬 것.
문제에서
-1000 - 555 0 10
-1000 - 555 0 10 500
-1000 1 44 => 이거 안 묶는게 낫다.
-1000 10 => -1000 + 10 이 -1000 x 10 보다 훨씬 나음.
0 1
왜냐하면.
지금 양수 대역에서, 가장 작은 것부터 묶어줄 쌍을 찾아주고 있다보니
2 3 5
가 있다면, 2 + ( 3 5 ) 가 더 큰 경우인데 (23 ) + 5 를 해주고 있게 됨.*
*( 양수에 대해서도, 앞에서부터 순차적으로 접근하고 있기 때문임. )*
6
-4
-1
0
2
4
5
// 26
7
9
7
4
2
8
8
7
//158
public class Main{
public static int n;
public static int[] arr;
public static boolean[] visit = new boolean[50];
public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static StringTokenizer st;
public static void setting() throws IOException {
n = Integer.parseInt(br.readLine());
arr = new int[n];
for(int i =0; i<n;i++)
arr[i] = Integer.parseInt(br.readLine());
}
// 없는 경우 -> return n;
public static int findFirst(int target){
int left = 0, right = n, mid = 0;
while(left<right){
mid = (left+right)/2;
if(arr[mid]>=target)right = mid;
else left = mid + 1 ;
}
return right;
}
public static int solve() {
int i = 0, sum = 0;
Arrays.sort(arr);
int under = findFirst(1); // 첫 번째 양수의 위치
// 양의 정수가 존재하는 경우
if (under != n) {
// 양수
for (i = n - 1; i > under; i--) {
if (visit[i]) continue;
// 다음수가 0 또는 1인 경우 -> 다음 수와 묶지 않는다
if (arr[i - 1] == 0 || arr[i - 1] == 1) {
sum += arr[i];
} else {
sum += (arr[i] * arr[i - 1]);
visit[i - 1] = true;
}
visit[i] = true;
}
// for 문에서, 양의 수 중 첫 번째 수까지 도달하지 못한 경우
if (!visit[under]) sum += arr[i];
}
// 음수가 존재하는 경우
if ( under > 0) {
for (i = 0; i < under - 1; i++) {
if (visit[i]) continue;
// 다음수가 양수 -> 다음수와 묶지 않는다
if (arr[i + 1] > 0) {
sum += arr[i];
}
// Otherwise -> 다음수와 묶어준다 ( 묶인 수는 다음 계산의 대상이 되지않는다 ->visit = true )
else {
sum += (arr[i] * arr[i + 1]);
visit[i + 1] = true;
}
visit[i] = true;
}
if (!visit[under - 1]) sum += arr[under - 1];
}
return sum;
}
public static void main(String[] args) throws IOException{
setting();
System.out.println(solve());
}
}
—> 이러면, 자연스럽게, 남은 부분들이 생기는데, 이들은 “+” 연산을 해 주면 되는 것들이 되어버림. ( 이러면 visit도 확인할 필요가 없음)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int ans = 0;
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(br.readLine());
}
Arrays.sort(arr);
int left = 0;
int right = n - 1;
for (; left < right; left += 2) {
if (arr[left] < 1 && arr[left + 1] < 1) {
ans += arr[left] * arr[left + 1];
} else {
break;
}
}
for (; right > 0; right -= 2) {
if (arr[right] > 1 && arr[right - 1] > 1) {
ans += arr[right] * arr[right - 1];
} else {
break;
}
}
for (; right >= left; right--) {
ans += arr[right];
}
System.out.println(ans);
}
}