https://www.acmicpc.net/problem/1744
1744번: 수 묶기
길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에
www.acmicpc.net
저는 음수와 양수에 대해 각각 우선순위 큐를 통해 문제를 해결하였습니다.
0은 음수의 우선순위 큐에 들어가도록 하였습니다. 이유는 -3 0 이렇게 남는다면 둘이 곱해야하지 최대가 되기 때문입니다. 양수의 경우는 곱하게 되면 0이 되기 때문에 최대가 되지 않습니다.
곱은 양수의 경우 큰 수 * 큰 수가 크고, 음수는 작은 수 * 작은 수가 더 크기 때문에 음수는 가장 값이 낮은 값이 먼저 나오게, 양수는 가장 값이 큰 값이 먼저 나오게 하여 2개의 곱을 더하고 하나만 남는다면 더하여 문제를 해결하였습니다.
양수에서 예외의 경우는 1인 경우는 두 수를 더하는 것이 더 크기 때문에 1인 경우는 그냥 더하여 문제를 해결하였습니다.
package BOJ.greedy;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.PriorityQueue;
import java.util.function.Function;
public class BOJ_1744 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Function<String,Integer> stoi = Integer::parseInt;
int n = stoi.apply(br.readLine());
int[] arr = new int[n];
for(int i = 0 ; i < n ; i++){
arr[i] = stoi.apply(br.readLine());
}
PriorityQueue<Integer> plus = new PriorityQueue<>(Collections.reverseOrder());
PriorityQueue<Integer> minus = new PriorityQueue<>();
for(int i = 0 ; i < n ; i++){
if(arr[i] <= 0){
minus.add(arr[i]);
}else{
plus.add(arr[i]);
}
}
int result = 0;
result += countMultiplySum(plus);
result += countMultiplySum(minus);
System.out.println(result);
}
private static int countMultiplySum(PriorityQueue<Integer> pq) {
int sum = 0;
while(pq.size() >= 2){
int num1 = pq.poll();
int num2 = pq.poll();
if(num2 == 1){
sum += num1 + num2;
continue;
}
sum += num1 * num2;
}
while(!pq.isEmpty()){
sum += pq.poll();
}
return sum;
}
}
'알고리즘' 카테고리의 다른 글
백준 2637번 장난감 조립 (JAVA) (0) | 2023.09.07 |
---|---|
백준 15658번 연산자 끼워넣기2 (JAVA) (0) | 2023.09.06 |
백준 29160번 나의 FIFA 팀 가치는? (JAVA) (1) | 2023.09.04 |
백준 28353번 고양이 카페 (JAVA) (0) | 2023.09.03 |
백준 25195번 Yes or yes (JAVA) (0) | 2023.09.02 |