코테/백준

[백준/JAVA] 1744번: 수 묶기

imname1am 2023. 4. 24. 20:44
반응형

🔺 문제

 

1744번: 수 묶기

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

www.acmicpc.net

 

🔺 코드

- 틀림

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());
        PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());

        for(int i = 0 ; i < N ; i++) {
            int num = Integer.parseInt(br.readLine());
            pq.add(num);
        }

        int data1 = 0;
        int data2 = 0;
        int sum = 0;

        while(pq.size() != 1) {
            data1 = pq.poll();
            data2 = pq.poll();

            if(data1 > 0) {
                if(data2 <= 0)      sum = sum + (data1 + data2); 
                else if(data2 > 0)  sum += data1 * data2;
            } else if(data1 < 0) {
                if(data2 >= 0)      sum = sum + (data1 + data2);
                else if(data2 < 0)  sum += data1 * data2;
            } else if(data1 == 0) {
                if(data2 < 0) {
                    sum += data1 * data2;
                } else if(data2 > 0) {
                    sum = sum + (data1 + data2);
                }
            }
        }
        System.out.println(sum);
    }
}

죄다 조건 걸어서 풀어볼까 하고 시도했었다.. 

 

 

- 정답

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());
        PriorityQueue<Integer> plusQ = new PriorityQueue<>(Collections.reverseOrder());
        PriorityQueue<Integer> minusQ = new PriorityQueue<>();

        int one = 0;
        int zero = 0;

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

            if(num == 0)        zero++;
            else if(num == 1)   one++;
            else if(num > 1)    plusQ.add(num);
            else if(num < 0)    minusQ.add(num);
        }

        int data1 = 0;
        int data2 = 0;
        int sum = 0;

        // 양수 우선순위 큐 크기가 2보다 작을 때까지
        while(plusQ.size() >= 2) {
            data1 = plusQ.remove();
            data2 = plusQ.remove();

            sum += data1 * data2;
        }

        // 큐에 데이터가 남아있으면
        if(!plusQ.isEmpty()) {
            sum += plusQ.remove();
        }

        // 음수 처리
        while(minusQ.size() >= 2) {
            data1 = minusQ.remove();
            data2 = minusQ.remove();

            sum += data1 * data2;
        }

        if(!minusQ.isEmpty() && zero == 0) {
            sum += minusQ.remove();
        }


        // 처리하기
        sum += one;	// 숫자 1 개수, 결과값에 저장
        System.out.println(sum);
    }
}
✅ 해결 아이디어
✔ 우선순위 큐 사용
- 가능한 큰 수끼리 묶기
- 수의 집합을 4분할 (1보다 큰 수 / 1 / 0 / 음수)

 


🔺 다른 풀이들

 

[백준 Gold 4] 1744 수 묶기 -Java

문제링크 : https://www.acmicpc.net/problem/1744 1744번: 수 묶기 길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두

rays-space.tistory.com

 


💬 느낀 점

어떤 조건식을 만들지..를 잘 생각해야 하는 것 같다.

 

 

1회독 2회독 3회독 4회독 5회독
V        
반응형