본문 바로가기

알고리즘/백준

[백준] 1744 수 묶기

문제링크: www.acmicpc.net/problem/1744

 

1744번: 수 묶기

길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에

www.acmicpc.net

부호가 같고, 절댓값이 큰 수끼리 묶는 것이 결과값이 큰 것이라는 것은 쉽게 알 수 있다. 숫자 1은 어떤 수와 묶는 것보다 안묶는 것이 1 더 크다는 것과 음수가 홀수일 때, 0이 있으면 0과 곱하는 것이 결과값을 더 크게할 수 있다는 것에 유의하며 코드를 짜면 된다

 

import java.io.*;
import java.util.*;
public class Main {

	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		long arr[] = new long[n];
		boolean isZero = false;
		int oneCnt = 0;
		for(int i=0;i<n;i++){
			arr[i] = Integer.parseInt(br.readLine());
			if(arr[i]==0) isZero = true;
			if(arr[i] == 1)oneCnt++;
		}
		ArrayList<Long> minus = new ArrayList<Long>();
		ArrayList<Long> plus = new ArrayList<Long>();
		for(int i=0;i<n;i++){
			if(arr[i] < 0){
				minus.add(arr[i]);
			}else if(arr[i] > 1){
				plus.add(arr[i]);
			}
		}
		Collections.sort(minus);
		Collections.sort(plus);;
		Collections.reverse(plus);
		
		long ans = 0;
		for(int i=0;i<minus.size()/2*2;i=i+2){
			ans += minus.get(i)*minus.get(i+1);
		}
		if(minus.size()%2==1){
			if(isZero==false){
				ans += minus.get(minus.size()-1);
			}
		}
		
		for(int i=0;i<plus.size()/2*2;i=i+2){
			ans+=plus.get(i)*plus.get(i+1);
		}
		if(plus.size()%2==1){
			ans += plus.get(plus.size()-1);
		}
		ans += oneCnt;
		System.out.println(ans);
	}

}

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 1976 여행가자  (0) 2021.02.15
[백준] 1963 소수 경로  (0) 2021.02.15
[백준] 14226 이모티콘 [JAVA]  (0) 2021.02.15
[백준] 같이 눈사람 만들래? [JAVA]  (0) 2021.02.04
[백준] 11000 강의실 배정 [JAVA]  (0) 2021.01.28