Algorithm/백준
[백준] 1744 수 묶기
SSONGMI
2021. 3. 10. 22:41
반응형
문제 출처: www.acmicpc.net/problem/1744
1744번: 수 묶기
길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에
www.acmicpc.net
: 길이가 N인 수열이 주어지고 수열의 합을 구해야한다.
: 단순히 수열에 있는 수들의 합이 아니고 각각의 수를 한번씩 묶을 수 있도록 하고 묶은 수는 서로 곱한 후에 더한다.
: 따라서 모든 수는 한번만 묶이거나 묶지 않아야 한다.
: 이러한 규칙에 따라 각각의 수를 적절히 묶을 때 그 합이 최대가 되도록 해야한다.
: 먼저 수열의 길이인 N을 입력받는다.
: 수열을 구성하는 숫자들을 입력받아 배열에 저장한다.
: 배열을 순회하며 0이하의 수들과 0을 초과하는 수들을 나눠 각각의 nagative, positive 배열에 저장한다.
: negative 배열의 경우 숫자가 작은 것이 서로 곱해져서 양수가 되면 가장 큰수가 되기 때문에 작은 수부터 접근하여 계산해 줄 수 있도록한다.
: positive인 경우 1은 곱하는 것보다 더하는 것이 수가 더 커지는 방향이므로 이러한 경우들을 모두 고려하여 계산한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringBuilder sb = new StringBuilder();
static StringTokenizer st;
public static void main(String[] args) throws NumberFormatException, IOException {
// 숫자의 개수를 입력받고
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N];
// 숫자 개수만큼 숫자들을 입력받고
for(int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(br.readLine());
}
// 정렬시켜서
Arrays.sort(arr);
int idx = 0;
if(arr[0] > 0) idx = 0;
else if(arr[N-1] <= 0) idx = N;
else {
// 몇번째 인덱스부터 양수가 시작되는지를 찾음
for(int i = 0; i < N; i++ ) {
if(arr[i] > 0) {
idx = i;
// System.out.println("dd");
break;
}
}
}
// 음수 양수가 나눠지는 기점부터 큰수를 묶기 시작함
int[] negative = Arrays.copyOfRange(arr, 0, idx);
int[] positive = Arrays.copyOfRange(arr, idx, N);
// System.out.println("idx = " + idx);
// System.out.println("negative"+Arrays.toString(negative));
// System.out.println("positive"+Arrays.toString(positive));
int total = 0;
for(int i = 0, size = negative.length; i < size; i+=2) {
if(i+1 < size) {
total += negative[i]*negative[i+1];
}else {
total += negative[i];
}
}
int index = positive.length-1;
while(index >= 0) {
// System.out.println("arr = " + arr[index]);
if(index-1 < 0 || positive[index] == 1 || (index-1 >= 0 && positive[index-1] == 1)) {
total += positive[index];
index--;
// System.out.println(total);
}else if(index-1 >= 0 && positive[index-1] != 1){
total += positive[index] * positive[index-1];
index -= 2;
}
}
System.out.println(total);
//-1 -2 -3 0 1 2 3
}
}
반응형