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);
		
	}
}