acmicpc
[BAEKJOON] 1744. 수 묶기
코드와이
2021. 9. 2. 23:38
문제링크
https://www.acmicpc.net/problem/1744
1744번: 수 묶기
길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에
www.acmicpc.net
쉽게 보이지만 의외로 생각해야하는 조건이 존재했던 문제
0과 1이 여러개 나올 경우를 생각해야 한다.
package acmicpc.Gold4;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
public class 수_묶기 {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
PriorityQueue<Integer> pq = new PriorityQueue<>();
int minus = 0;
int plus = 0;
int zero = 0;
int one = 0;
int x;
for(int i = 0 ; i < n ; i++) {
x = Integer.parseInt(br.readLine());
pq.add(x);
if(x < 0) minus++;
else if(x == 1) one++;
else if(x > 0) plus++;
else zero++;
}
int ans = 0;
int a, b;
// 음수 더하기
for(int i = 0 ; i < minus / 2 ; i++) {
a = pq.poll();
b = pq.poll();
ans += a * b;
}
// 음수가 하나 남아있고 0이 1개 이상 있을 때
// 음수를 0으로 바꾸어준다.
if(minus % 2 == 1 && zero > 0) {
zero--;
pq.poll();
pq.poll();
}
// 두 양수의 곱을 더하기 전까지 ans에 더한다.
// 1을 제외한 양수만을 더해준다.
while(pq.size() != plus) {
ans += pq.poll();
}
if(plus % 2 == 1) ans += pq.poll();
for(int i = 0 ; i < plus / 2 ; i++) {
a = pq.poll();
b = pq.poll();
ans += a * b;
}
System.out.println(ans);
}
}