[백준] 1744 수 묶기

장철현·2024년 1월 2일
0

백준

목록 보기
42/80

링크

1744 수 묶기

문제

풀이

이 문제는 -끼리는 가장 작은 값을 묶어야 가장 커진다.
+끼리는 가장 큰 값을 묶어야 가장 커진다.
0은 - 중에서 가장 큰 값이나 안묶으면 가장 크기 때문에 이 점을 생각하고 계산해야 한다.

-와 0끼리 계산하고 +는 +끼리 계산해야 된다.
즉 배열이 -3, -2, -1, 0, 1, 2, 3이 있다고 한다면

  1. -와 0 계산하기
    (-3 -2) + (-1 0) 이렇게 해야 가장 커진다
    (-3 * -2) + -1 + 0 이라면 위에 식보다 작기 때문에 무조건 위처럼 계산해야 한다.

  2. +값 계산하기
    +값은 내림차순으로 정렬해서 계산하는 것이 편하다
    3 2 1 이렇게 되니까
    (3 * 2) + 1 이렇게 되어야 가장 큰 값이다.

주의할 점은 예제 입력 5번처럼
2
1
1
이렇게 주어졌을 때이다.
값은 2가 되야 하는데 위의 로직처럼 실행하면 1 * 1 = 1으로 답이 1이 나온다.
그러므로 두 수를 더했을 때와 곱했을 때의 최댓값을 sum에다가 더해주면 된다.

코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
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());

        // minus and 0 list
        List<Integer> list1 = new ArrayList<>();

        // plus list
        List<Integer> list2 = new ArrayList<>();

        for(int i=0;i<n;i++){
            int element = Integer.parseInt(br.readLine());

            if(element <= 0){
                list1.add(element);
            } else{
                list2.add(element);
            }

        }

        Collections.sort(list1);
        Collections.sort(list2, Collections.reverseOrder());

        long sum = 0;

        for(int i=0;i<list1.size();i+=2){
            if(i == list1.size() - 1){
                sum += list1.get(i);
            } else{
                sum += list1.get(i) * list1.get(i+1);
            }
        }

        for(int i=0;i<list2.size();i+=2){
            if(i == list2.size() - 1){
                sum += list2.get(i);
            } else{
                sum += Math.max(list2.get(i) * list2.get(i+1), list2.get(i) + list2.get(i+1));
            }
        }

        System.out.println(sum);

    }


}

0개의 댓글