Algorithm/BOJ

[Boj_2696] ์ค‘์•™๊ฐ’ ๊ตฌํ•˜๊ธฐ

jeong_ii 2025. 2. 15. 00:27

๐Ÿ“Ž ๋ฌธ์ œ ๋งํฌ

https://www.acmicpc.net/problem/2696

 

โ–ธ ๋ฌธ์ œ

์–ด๋–ค ์ˆ˜์—ด์„ ์ฝ๊ณ , ํ™€์ˆ˜๋ฒˆ์งธ ์ˆ˜๋ฅผ ์ฝ์„ ๋•Œ ๋งˆ๋‹ค, ์ง€๊ธˆ๊นŒ์ง€ ์ž…๋ ฅ๋ฐ›์€ ๊ฐ’์˜ ์ค‘์•™๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ˆ˜์—ด์ด 1, 5, 4, 3, 2 ์ด๋ฉด, ํ™€์ˆ˜๋ฒˆ์งธ ์ˆ˜๋Š” 1๋ฒˆ์งธ ์ˆ˜, 3๋ฒˆ์งธ ์ˆ˜, 5๋ฒˆ์งธ ์ˆ˜์ด๊ณ , 1๋ฒˆ์งธ ์ˆ˜๋ฅผ ์ฝ์—ˆ์„ ๋•Œ ์ค‘์•™๊ฐ’์€ 1, 3๋ฒˆ์งธ ์ˆ˜๋ฅผ ์ฝ์—ˆ์„ ๋•Œ๋Š” 4, 5๋ฒˆ์งธ ์ˆ˜๋ฅผ ์ฝ์—ˆ์„ ๋•Œ๋Š” 3์ด๋‹ค.

 

โ–ธ ์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ T(1 ≤ T ≤ 1,000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ฒซ์งธ ์ค„์—๋Š” ์ˆ˜์—ด์˜ ํฌ๊ธฐ M(1 ≤ M ≤ 9999, M์€ ํ™€์ˆ˜)์ด ์ฃผ์–ด์ง€๊ณ , ๊ทธ ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ ์ด ์ˆ˜์—ด์˜ ์›์†Œ๊ฐ€ ์ฐจ๋ก€๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ์›์†Œ๋Š” ํ•œ ์ค„์— 10๊ฐœ์”ฉ ๋‚˜๋ˆ„์–ด์ ธ์žˆ๊ณ , 32๋น„ํŠธ ๋ถ€ํ˜ธ์žˆ๋Š” ์ •์ˆ˜์ด๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด ์ฒซ์งธ ์ค„์— ์ถœ๋ ฅํ•˜๋Š” ์ค‘์•™๊ฐ’์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๊ณ , ๋‘˜์งธ ์ค„์—๋Š” ํ™€์ˆ˜ ๋ฒˆ์งธ ์ˆ˜๋ฅผ ์ฝ์„ ๋•Œ ๋งˆ๋‹ค ๊ตฌํ•œ ์ค‘์•™๊ฐ’์„ ์ฐจ๋ก€๋Œ€๋กœ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ถœ๋ ฅํ•œ๋‹ค. ์ด๋•Œ, ํ•œ ์ค„์— 10๊ฐœ์”ฉ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค.

 

๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด

  • ๐Ÿฅ‡  ๋ฌธ์ œ ๋ ˆ๋ฒจ : ๊ณจ๋“œ 2
  • ๐Ÿ””  ๋ฌธ์ œ ์œ ํ˜• : ์ž๋ฃŒ ๊ตฌ์กฐ, ์šฐ์„ ์ˆœ์œ„ ํ 
  • ๐Ÿ’ฌ  ํ’€์ด ์–ธ์–ด : JAVA

 

๐Ÿค” ๋ฌธ์ œ ํ’€์ด

๋ฐฑ์ค€ 1655 ๊ฐ€์šด๋ฐ๋ฅผ ๋งํ•ด์š”์™€ ๋น„์Šทํ•œ ๋ฌธ์ œ์ด๋‹ค.

 

์šฐ์„ ์ˆœ์œ„ ํ ๋‘ ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘์•™๊ฐ’์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

 

๋จผ์ €, ์ตœ๋Œ€ ํž™๊ณผ ์ตœ์†Œ ํž™์„ ๊ตฌํ˜„ํ•  ์šฐ์„ ์ˆœ์œ„ ํ ๋‘ ๊ฐœ๋ฅผ ์„ ์–ธํ•œ๋‹ค.

์ตœ๋Œ€ ํž™์€ ์ตœ๋Œ“๊ฐ’์„ ์ •๋ ฌํ•˜๋„๋ก ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ณ ,

์ตœ์†Œ ํž™์€ ์ตœ์†Ÿ๊ฐ’์„ ์ •๋ ฌํ•˜๋„๋ก ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.

PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Comparator.reverseOrder());
PriorityQueue<Integer> minHeap = new PriorityQueue<>();

 

๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ ๊ฐ๊ฐ ํž™์— ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค.

if (minHeap.size() == maxHeap.size()) maxHeap.offer(num);
else minHeap.offer(num);

 

์ตœ๋Œ€ ํž™์˜ ์ตœ๋Œ“๊ฐ’ > ์ตœ์†Œ ํž™์˜ ์ตœ์†Ÿ๊ฐ’์ผ๋•Œ, ๋‘ ๊ฐ’์„ ๊ตํ™˜ํ•œ๋‹ค.

if (maxHeap.peek() > minHeap.peek()) {
    int tmp = minHeap.poll();
    minHeap.offer(maxHeap.poll());
    maxHeap.offer(tmp);
}

 

๊ทธ๋Ÿฌ๋ฉด ์ตœ๋Œ€ ํž™์—๋Š” ์ค‘์•™๊ฐ’ ์ดํ•˜์˜ ์ˆ˜๋งŒ, ์ตœ์†Œ ํž™์—๋Š” ์ค‘์•™๊ฐ’ ์ดˆ๊ณผ์˜ ์ˆ˜๋งŒ ์กด์žฌํ•˜๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์—, ์ตœ๋Œ€ ํž™์—๋Š” ํ•ญ์ƒ ์ค‘์•™๊ฐ’์ด ์กด์žฌํ•˜๊ฒŒ ๋œ๋‹ค.

 

๋งˆ์ง€๋ง‰์œผ๋กœ, ํ™€์ˆ˜๋ฒˆ์งธ  ์ˆ˜๋ฅผ ์ฝ์„ ๋•Œ๋งŒ ์ตœ๋Œ€ ํž™์—์„œ ์ค‘์•™๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋ฉด ๋œ๋‹ค.

 

์œ„ ํ’€์ด๋ฅผ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•ด ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

โœ” ์ตœ์ข… ์ฝ”๋“œ

๋ฉ”๋ชจ๋ฆฌ : 15924KB
์‹œ๊ฐ„ : 152ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st = null;
        int t = Integer.parseInt(br.readLine()); // ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ˆ˜
        while (t --> 0) {
            // ์ตœ๋Œ€ํž™
            PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Comparator.reverseOrder());
            // ์ตœ์†Œํž™
            PriorityQueue<Integer> minHeap = new PriorityQueue<>();

            int m = Integer.parseInt(br.readLine());

            sb.append((m/2)+1).append("\n"); // ์ค‘์•™ ๊ฐ’ ๊ฐœ์ˆ˜

            int cnt = 0;
            for (int i = 0; i < m; i++) {
                if (i % 10 == 0) { // ์›์†Œ๋Š” ํ•œ์ค„์— 10๊ฐœ์”ฉ
                    st = new StringTokenizer(br.readLine());
                }
                
                // ์ค‘์•™ ๊ฐ’ ๊ตฌํ•˜๊ธฐ
                int num = Integer.parseInt(st.nextToken());
                if (minHeap.size() == maxHeap.size()) maxHeap.offer(num);
                else minHeap.offer(num);

                if (!minHeap.isEmpty() && !maxHeap.isEmpty()) {
                    if (maxHeap.peek() > minHeap.peek()) {
                        int tmp = minHeap.poll();
                        minHeap.offer(maxHeap.poll());
                        maxHeap.offer(tmp);
                    }
                }

                // ํ™€์ˆ˜ ๋ฒˆ์งธ ์ˆ˜๋ฅผ ์ฝ์„ ๋•Œ๋งˆ๋‹ค
                if (i % 2 == 0) {
                    // ์ถœ๋ ฅ๋„ ํ•œ ์ค„์— ์›์†Œ 10๊ฐœ์”ฉ
                    if (cnt == 9 || i == m-1) {
                        sb.append(maxHeap.peek()).append("\n");
                        cnt = 0;
                    } else {
                        sb.append(maxHeap.peek()).append(" ");
                    }
                    cnt++;
                }
            }
        }

        System.out.println(sb);
    }
}

 

์ „์— ๊ฐ€์šด๋ฐ๋ฅผ ๋งํ•ด์š” ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ์šฐ์„ ์ˆœ์œ„ ํ ๋‘ ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘์•™๊ฐ’์„ ์ฐพ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด๊ฐ€ ๊ต‰์žฅํžˆ ์‹ ๊ธฐํ•˜๊ณ  ์ธ์ƒ ๊นŠ์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฒˆ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ ๊ทธ๋•Œ ํ’€์ด๋ฅผ ํ™œ์šฉํ–ˆ๊ณ , ๋ธ”๋กœ๊ทธ์— ํฌ์ŠคํŒ…ํ•˜๋ฉฐ ๋‹ค์‹œ ํ•œ๋ฒˆ ์ •๋ฆฌํ–ˆ๋‹ค.

๋ถ€์ง€๋Ÿฐํžˆ ๋” ์—ด์‹ฌํžˆ ๊ณต๋ถ€ํ•ด์•ผ์ง€...๐Ÿ’ญ