[백준] 1744 : 수 묶기 - Java

Chooooo·2024년 4월 21일
0

알고리즘/Java

목록 보기
16/16

문제

수 묶기
수열 n개

내 코드


import java.io.*;
import java.util.*;



public class Main {

    // ! 수 묶기
    static int n;
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer st;

    public static void main(String[] args) throws IOException {
        n = Integer.parseInt(br.readLine());
        PriorityQueue<Integer> plus = new PriorityQueue<>((a, b) -> b.compareTo(a)); // ! 양수는 내림차순
        PriorityQueue<Integer> minus = new PriorityQueue<>(); // ! 음수는 오름차순
        for (int i = 0; i < n; i++) {
            int num = Integer.parseInt(br.readLine());
            if(num > 0) plus.offer(num);
            else minus.offer(num);
        }

        List<Integer> temp = new ArrayList<>();
        int res = 0;
        while (plus.size() > 1) {
            int numA = plus.poll();
            int numB = plus.poll();
            if (numA * numB > numA + numB) {
                res += numA * numB;
            }else{
                res += numA + numB;
            }
        }

        if (!plus.isEmpty()) {
            temp.add(plus.poll());
        }

        while (minus.size() > 1) {
            int numA = minus.poll();
            int numB = minus.poll();
            if (numA * numB > numA + numB) {
                res += numA * numB;
            }else{
                res += numA + numB;
            }
        }

        if (!minus.isEmpty()) {
            temp.add(minus.poll());
        }

        if (temp.size() == 2) {
            int numA = temp.get(0);
            int numB = temp.get(1);
            if(numA * numB > numA + numB){
                res += numA * numB;
            }else{
                res += numA + numB;
            }
        } else if (temp.size() == 1) {
            res += temp.get(0);
        }

        System.out.println(res);

    }
}

코멘트

가장 큰 값을 뽑아낸다는 생각 -> 그리디
근데 예외 케이스만 잘 처리했으면 됐음.

결국 0이하는 오름차순으로 유지, 양수는 내림차순.

각각 따로 계산해서 진행했으면 쉽게 해결.

(음수끼리는 곱하는게 무조건 이득) (양수끼리는 1제외 곱하는게 무조건 이득)
그리고 0이하에서 0이 나온 경우 짝수 개수라면 곱하는게 이득, 홀수라면 그냥 더하는게 이득.

즉 음수는 오름차순으로 올라오면서 곱할지 더할지를 판단했으면 됐고, 양수는 내림차순으로 내려오면서 곱할지 더할지를 판단했으면 됐다.

profile
back-end, 지속 성장 가능한 개발자를 향하여

0개의 댓글