[백준 1744] 수 묶기(Java)

최민길(Gale)·2023년 5월 24일
1

알고리즘

목록 보기
70/172

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

이 문제는 그리디 알고리즘과 우선순위 큐를 사용하여 풀 수 있습니다. 이 문제는 양수일 경우와 음수일 경우 묶는 방법이 다르게 됩니다.

양수일 경우 : 절댓값이 큰 수들 순서대로 묶어서 더하기
--> 주의할 점 : 1과 어떤 수를 곱하면 손해이므로 둘 중 하나가 1일 경우 곱하지 않고 더하기

음수 및 0일 경우 : 절댓값이 큰 수들 순서대로 묶어서 더하기

따라서 우선순위 큐를 2개 설정하여 양수는 내림차순, 음수는 오름차순 정렬하여 값을 추가한 후 위의 규칙에 맞게 곱한 후 더해주면 됩니다.

다음은 코드입니다.

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

class Main{

    static int getSum(PriorityQueue<Integer> pq){
        Queue<Integer> queue = new LinkedList<>();
        while(!pq.isEmpty()){
            int curr = pq.poll();

            if(pq.isEmpty()) queue.add(curr);
            else{
                int next = pq.poll();
                if(curr==1 || next==1){
                    queue.add(curr);
                    queue.add(next);
                }
                else queue.add(curr*next);
            }
        }

        int res = 0;
        while(!queue.isEmpty()){
            res += queue.poll();
        }
        return res;
    }

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        PriorityQueue<Integer> over = new PriorityQueue<>(Collections.reverseOrder());
        PriorityQueue<Integer> under = new PriorityQueue<>();

        int N = Integer.parseInt(br.readLine());
        for(int i=0;i<N;i++){
            int n = Integer.parseInt(br.readLine());
            if(n>0) over.add(n);
            else under.add(n);
        }

        int res = getSum(over) + getSum(under);
        System.out.println(res);
    }
}

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글