๊ธฐ๋ก๋ฐฉ

BOJ_7662 : ์ด์ค‘ ์šฐ์„ ์ˆœ์œ„ ํ ๋ณธ๋ฌธ

CodingTest/Java

BOJ_7662 : ์ด์ค‘ ์šฐ์„ ์ˆœ์œ„ ํ

Soom_1n 2023. 3. 29. 13:15

๐Ÿ‘‰ ๋ฌธ์ œ๋งํฌ

 

7662๋ฒˆ: ์ด์ค‘ ์šฐ์„ ์ˆœ์œ„ ํ

์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋Š” ํ‘œ์ค€์ž…๋ ฅ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ž…๋ ฅ์€ T๊ฐœ์˜ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ์ž…๋ ฅ์˜ ์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์˜ ์ฒซ์งธ ์ค„์—๋Š” Q์— ์ 

www.acmicpc.net



๐Ÿ”ธ ๋ฌธ์ œ ๋ถ„์„ ๐Ÿ”ธ

  • int ๋ฒ”์œ„์˜ ๊ฐ’์„ ๋„ฃ๋Š” 'I' ์—ฐ์‚ฐ๊ณผ ์ตœ๋Œ€๊ฐ’ ํ˜น์€ ์ตœ์†Œ๊ฐ’์„ ๋นผ๋Š” 'D'์—ฐ์‚ฐ์ด k๋ฒˆ ์ˆ˜ํ–‰๋œ๋‹ค.
    • ์ตœ์ข… ์—ฐ์‚ฐ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
  • k์˜ ์ตœ๋Œ€๊ฐ’์ด 1,000,000 ์ด๋ฏ€๋กœ ๊ฐ’์„ ์ €์žฅํ•  ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํž™ ํ˜•ํƒœ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
    • ํž™์ •๋ ฌ์ด ์ ์šฉ๋œ, ์šฐ์„ ์ˆœ์œ„ ํ(Priority Queue) ํ˜น์€ TreeMap์„ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ”ธ Priority Queue ๐Ÿ”ธ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.Queue;
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;
        // TestCase
        int T = Integer.parseInt(br.readLine());
        for (int t = 0; t < T; t++) {
            // Input
            int k = Integer.parseInt(br.readLine());
            Queue<Integer> max_pq = new PriorityQueue<>(k, Collections.reverseOrder());
            Queue<Integer> min_pq = new PriorityQueue<>(k);
            Map<Integer, Integer> map = new HashMap<>();

            for (int i = 0; i < k; i++) {
                st = new StringTokenizer(br.readLine());
                char order = st.nextToken().charAt(0);
                int num = Integer.parseInt(st.nextToken());
                // Orders
                if (order == 'I') { // Inque
                    max_pq.add(num);
                    min_pq.add(num);
                    map.put(num, map.getOrDefault(num, 0) + 1);
                } else {            // Deque
                    if (num == 1) {     // max_pq deque
                        deque(max_pq, map);
                    } else {            // min_pq deque
                        deque(min_pq, map);
                    }
                }
            }
            int max = Integer.MIN_VALUE;
            int min = Integer.MAX_VALUE;
            boolean flag = true;

            for (int key : map.keySet()) {
                int num = map.get(key);
                if (num > 0) {
                    flag = false;
                    max = Math.max(max, key);
                    min = Math.min(min, key);
                }
            }

            if (flag) {
                sb.append("EMPTY").append('\n');
            } else {
                sb.append(max).append(' ').append(min).append('\n');
            }
        }
        System.out.print(sb);
    }

    private static void deque(Queue<Integer> queue, Map<Integer, Integer> map) {
        while (!queue.isEmpty()) {
            int num = queue.poll();

            if (map.get(num) > 0) {
                map.put(num, map.get(num) - 1);
                break;
            }
        }
    }
}

๐Ÿ”ธ ์ฝ”๋“œ ํ•ด์„ ๐Ÿ”ธ

  • ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ 2๊ฐœ ๋งŒ๋“ค์–ด ๊ฐ๊ฐ ์ตœ๋Œ€ํž™๊ณผ ์ตœ์†Œํž™์œผ๋กœ ์ •๋ ฌ์กฐ๊ฑด์„ ์ง€์ •ํ•ด ์ตœ๋Œ€๊ฐ’๊ณผ ์ตœ์†Œ๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
  • ํ˜„์žฌ ์œ ํšจํ•œ ์›์†Œ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด map์œผ๋กœ ๊ณตํ†ต ์›์†Œ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
    • ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ pollํ•œ ๊ฐ’์ด map์— ์žˆ๋Š” ์›์†Œ๋ผ๋ฉด, ์œ ํšจํ•˜๋ฏ€๋กœ D์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰ ๋œ ๊ฒƒ์ด๋‹ค.
    • ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ pollํ•œ ๊ฐ’์ด map์— ์—†๋Š” ์›์†Œ๋ผ๋ฉด, ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‹ค์‹œ ํ•œ ๋ฒˆ pollํ•œ๋‹ค.

๐Ÿ”ธ Priority Queue ๐Ÿ”ธ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

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;
        // TestCase
        int T = Integer.parseInt(br.readLine());
        for (int t = 0; t < T; t++) {
            // Input
            int k = Integer.parseInt(br.readLine());
            TreeMap<Integer, Integer> treeMap = new TreeMap<>();

            int max, min;
            for (int i = 0; i < k; i++) {
                st = new StringTokenizer(br.readLine());
                char order = st.nextToken().charAt(0);
                int num = Integer.parseInt(st.nextToken());
                // Orders
                if (order == 'I') { // Inque
                    treeMap.put(num, treeMap.getOrDefault(num,0)+1);
                } else {            // Deque
                    if (treeMap.isEmpty()) continue;
                    if (num == 1) {     // max deque
                        max = treeMap.lastEntry().getValue();
                        if (max == 1) {
                            treeMap.remove(treeMap.lastKey());
                        } else {
                            treeMap.put(treeMap.lastKey(), max-1);
                        }
                    } else {            // min deque
                        min = treeMap.firstEntry().getValue();
                        if (min == 1) {
                            treeMap.remove(treeMap.firstKey());
                        } else {
                            treeMap.put(treeMap.firstKey(), min-1);
                        }
                    }
                }
            }

            if (treeMap.isEmpty()) {
                sb.append("EMPTY").append('\n');
            } else {
                sb.append(treeMap.lastKey()).append(' ').append(treeMap.firstKey()).append('\n');
            }
        }
        System.out.print(sb);
    }
}

๐Ÿ”ธ ์ฝ”๋“œ ํ•ด์„ ๐Ÿ”ธ

  • TreeMap์„ ๋งŒ๋“ค์–ด ์›์†Œ๋ฅผ ์ €์žฅํ•œ๋‹ค.
    • java์˜ TreeMap์€ Red-Black Tree๋กœ, ์™ผ์ชฝ ์ž์‹์€ ๋ถ€๋ชจ๋ณด๋‹ค ์ž‘์€ ๊ฐ’, ์˜ค๋ฅธ์ชฝ ์ž์‹์€ ๋ถ€๋ชจ๋ณด๋‹ค ํฐ ๊ฐ’์˜ ํ˜•ํƒœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.
    • key๋ฅผ ์ž๋™์œผ๋กœ ์ •๋ ฌํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— 'I'์—ฐ์‚ฐ์œผ๋กœ ๋„ฃ๋Š” ๊ฐ’์„ ํ‚ค๋กœ ๋„ฃ๊ณ , ๊ทธ ๋ˆ„์  ๊ฐ’์„ value๋กœ ์ €์žฅํ•œ๋‹ค. (์ค‘๋ณต๋œ ๊ฐ’๋„ 'I' ์—ฐ์‚ฐ์œผ๋กœ ๋“ค์–ด์˜ค๊ธฐ ๋•Œ๋ฌธ)
    • firstKey๋กœ ์ตœ์†Œ๊ฐ’, lastKey๋กœ ์ตœ๋Œ€๊ฐ’์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  • ์ด์ค‘ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋– ์˜ค๋ฅด์ง€ ์•Š์•„์„œ ๊ณ ๋ฏผํ•˜๋‹ค ํ’€์ด๋ฅผ ์ฐพ์•„๋ณด์•˜๋‹ค.
    • ์ฒ˜์Œ ํ’€์ด๋Š” ์šฐ์„ ์ˆœ์œ„ ํ 2๊ฐœ์™€ ๋งต 1๊ฐœ๋ฅผ ์ด์šฉํ•œ ํ’€์ด์—ˆ๋‹ค.
      • ์ตœ๋Œ€ํž™๊ณผ ์ตœ์†Œํž™์„ ์–ด๋–ป๊ฒŒ ํ•จ๊ป˜ ๊ตฌํ˜„ํ• ๊นŒ ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ ์ด ํ’€์ด๊ฐ€ ๋”ฑ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.
    • ์ข€๋” ๊ฐ„๊ฒฐํ•œ ํ’€์ด๊ฐ€ ์—†์„๊นŒ ํ–ˆ๋Š”๋ฐ TreeMap ํ’€์ด๊ฐ€ ๋” ์ •์„์ ์ธ ๊ฒƒ ๊ฐ™๋‹ค.
      • ์ฝ”๋“œ๋„ ์งง์•„์ง€๊ณ  ์‹œ๊ฐ„๋ณต์žก๋„๋„ ๋‚ฎ์•„์กŒ๋‹ค.
  • ๋ฌธ์ œ ๋ถ„์„๊ณผ ํ’€์ด ๊ณ„ํš์„ ์ ์œผ๋ฉฐ ํ’€์ดํ–ˆ๋‹ค.

728x90

'CodingTest > Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

BOJ_1010 : ๋‹ค๋ฆฌ ๋†“๊ธฐ  (0) 2023.04.06
BOJ_1463 : 1๋กœ ๋งŒ๋“ค๊ธฐ  (0) 2023.03.30
BOJ_5430 : AC  (0) 2023.03.28
BOJ_9019 : DSLR  (0) 2023.03.21
BOJ_14502 : ์—ฐ๊ตฌ์†Œ  (0) 2023.03.08