[Boj_1194] ์•„์ด์Šคํฌ๋ฆผ ๋„๋‘‘ ์ง€ํ˜ธ

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

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

 

โ–ธ ๋ฌธ์ œ

์ง€ํ˜ธ๋Š” ๋งค์ผ ์•„์ด์Šคํฌ๋ฆผ ๊ฐ€๊ฒŒ์— ๋ฐฉ๋ฌธํ•œ๋‹ค. ์•„์ด์Šคํฌ๋ฆผ์„ ๋จน๋˜ ์ง€ํ˜ธ๋Š” ๋†€๋ผ ์ž๋น ์งˆ ์ˆ˜๋ฐ–์— ์—†์—ˆ๋‹ค. ์‹ค์ˆ˜๋กœ ๋ฏผํŠธ์ดˆ์ฝ” ๋ง›์„ ๋จน์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋Œ€๋‹ค์ˆ˜์˜ ์‚ฌ๋žŒ์€ ์น˜์•ฝ ๋ง›์ด ๋‚œ๋‹ค๋Š” ์ด์œ ๋กœ ๋ฏผํŠธ์ดˆ์ฝ”๋ฅผ ์‹ซ์–ดํ•œ๋‹ค. ์•„์ด์Šคํฌ๋ฆผ์œผ๋กœ ์ด๋ฅผ ๋‹ฆ๋Š”๋‹ค๋Š” ๋ฐœ์ƒ์€ ๋ˆ„๊ฐ€ ํ•œ ๊ฒƒ์ธ์ง€ ๊ถ๊ธˆํ•  ๋ฟ์ด๋‹ค. ์•„๋ฌดํŠผ ๋งค๋ฒˆ ์•„์ด์Šคํฌ๋ฆผ์„ ์‚ฌ ๋จน๋Š” ๊ฒƒ์ด ์ง€๊ฒจ์›Œ์ง„ ์ง€ํ˜ธ๋Š” ์ด์ œ๋ถ€ํ„ฐ ์•„์ด์Šคํฌ๋ฆผ์„ ํ›”์ณ ๋จน๊ธฐ๋กœ ๊ฒฐ์‹ฌํ•˜์˜€๋‹ค.

์•„์ด์Šคํฌ๋ฆผ ๊ฐ€๊ฒŒ์—๋Š” ๋‹ค์–‘ํ•œ ๋ง›์˜ ์•„์ด์Šคํฌ๋ฆผ N๊ฐœ๊ฐ€ ํ•œ ์ค„๋กœ ๋ฐฐ์น˜๋˜์–ด ์žˆ๋‹ค. ์•„์ด์Šคํฌ๋ฆผ์—๋Š” ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ๋Š”๋ฐ, ๊ฐ€์žฅ ์™ผ์ชฝ ์•„์ด์Šคํฌ๋ฆผ์ด 1๋ฒˆ, ๊ทธ ์˜ค๋ฅธ์ชฝ์€ 2๋ฒˆ, ..., ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„์ด์Šคํฌ๋ฆผ์€ N๋ฒˆ์ด๋‹ค. ์ง€ํ˜ธ๋Š” ํ•ญ์ƒ ์–‘์ด ๊ฐ€์žฅ ๋งŽ์€ ์•„์ด์Šคํฌ๋ฆผ์„ ์„ ํƒํ•˜์—ฌ ์ „๋ถ€ ๋จน๋Š”๋‹ค. ์–‘์ด ๊ฐ€์žฅ ๋งŽ์€ ์•„์ด์Šคํฌ๋ฆผ์ด ์—ฌ๋Ÿฌ ๊ฐœ๋ผ๋ฉด ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” ๊ฒƒ์„ ๋จน๋Š”๋‹ค.

์ง€ํ˜ธ๋Š” ๋Œ€๋‹ค์ˆ˜์˜ ์‚ฌ๋žŒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฏผํŠธ์ดˆ์ฝ” ๋ง›์„ ์‹ซ์–ดํ•œ๋‹ค. ๋‹คํ–‰ํžˆ ์ง€ํ˜ธ๋Š” ์•„์ด์Šคํฌ๋ฆผ์˜ ์–‘์ด ์ฃผ์–ด์งˆ ๋•Œ ์•„์ด์Šคํฌ๋ฆผ์˜ ๋ง›์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ง€ํ˜ธ์˜ ํŒ๋ณ„๋ฒ•์— ๋”ฐ๋ฅด๋ฉด, ์•„์ด์Šคํฌ๋ฆผ์˜ ์–‘์ด 7์˜ ๋ฐฐ์ˆ˜๋ผ๋ฉด ๋ฏผํŠธ์ดˆ์ฝ” ๋ง›์ด๊ณ , ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋ฏผํŠธ์ดˆ์ฝ” ๋ง›์ด ์•„๋‹ˆ๋ผ๊ณ  ํ•œ๋‹ค.

์ง€ํ˜ธ๋Š” ๋ฏผํŠธ์ดˆ์ฝ”๋ฅผ ์‹ซ์–ดํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ช…์‹ฌํ•˜๋ผ. ๋ฏผํŠธ์ดˆ์ฝ” ๋ง› ์•„์ด์Šคํฌ๋ฆผ์„ ๋จน์€ ์ง€ํ˜ธ๋Š” ํฌ๊ฒŒ ๋ถ„๋…ธํ•˜์—ฌ ๋‚จ์•„ ์žˆ๋Š” ์•„์ด์Šคํฌ๋ฆผ์˜ ์ˆœ์„œ๋ฅผ ์ขŒ์šฐ๋กœ ๋’ค์ง‘๋Š”๋‹ค. ์ฆ‰, K๊ฐœ์˜ ์•„์ด์Šคํฌ๋ฆผ์ด ์žˆ๋‹ค๋ฉด i๋ฒˆ์งธ ์•„์ด์Šคํฌ๋ฆผ๊ณผ (K - i + 1)๋ฒˆ์งธ ์•„์ด์Šคํฌ๋ฆผ์˜ ์œ„์น˜๋ฅผ ๋’ค๋ฐ”๊พผ๋‹ค. (1 ≤ i ≤ ⌊K / 2⌋)

์ง€ํ˜ธ๋Š” N๊ฐœ์˜ ์•„์ด์Šคํฌ๋ฆผ ์ค‘ M๊ฐœ์˜ ์•„์ด์Šคํฌ๋ฆผ์„ ๋จน์œผ๋ ค ํ•œ๋‹ค. ์•„์ด์Šคํฌ๋ฆผ์˜ ์–‘์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ง€ํ˜ธ๊ฐ€ ๋จน์€ ์•„์ด์Šคํฌ๋ฆผ์˜ ๋ฒˆํ˜ธ๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

โ–ธ ์ž…๋ ฅ

์ฒซ ๋ฒˆ์งธ ์ค„์— ์ „์ฒด ์•„์ด์Šคํฌ๋ฆผ์˜ ๊ฐœ์ˆ˜ N๊ณผ ์ง€ํ˜ธ๊ฐ€ ๋จน์„ ์•„์ด์Šคํฌ๋ฆผ์˜ ๊ฐœ์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘ ๋ฒˆ์งธ ์ค„์— N๊ฐœ์˜ ์ •์ˆ˜ A1, A2, ..., AN์ด ์ฃผ์–ด์ง„๋‹ค. ์ด๋•Œ Ai๋Š” i๋ฒˆ ์•„์ด์Šคํฌ๋ฆผ์˜ ์–‘์„ ์˜๋ฏธํ•œ๋‹ค.

๋ชจ๋“  ์ž…๋ ฅ์€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง„๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

M๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ i(1 ≤ i ≤ M)๋ฒˆ์งธ ์ค„์—๋Š” ์ง€ํ˜ธ๊ฐ€ i๋ฒˆ์งธ๋กœ ๋จน์€ ์•„์ด์Šคํฌ๋ฆผ์˜ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

โ–ธ ์ œํ•œ

  • 1 ≤ N ≤ 100,000
  • 1 ≤ M ≤ N
  • 1 ≤ Ai ≤ 1,000,000,000

 

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

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

 

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

์ด ๋ฌธ์ œ๋Š” TreeMap๊ณผ TreeSet์„ ํ™œ์šฉํ•ด์„œ ํ•ด๊ฒฐํ–ˆ๋‹ค.

 

๋จผ์ €, TreeMap์„ ์„ ์–ธํ•œ ๋’ค key, value๋Š” ๊ฐ๊ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•œ๋‹ค.

  • key : ์•„์ด์Šคํฌ๋ฆผ ์–‘ (amount)
  • value : ๊ทธ ์–‘์„ ๊ฐ€์ง„ ์•„์ด์Šคํฌ๋ฆผ๋“ค์˜ ์ธ๋ฑ์Šค๋“ค (TreeSet<Integer>)

์ด๋•Œ, TreeSet<Integer>์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ? ๐Ÿค”

 

๋ฌธ์ œ ์กฐ๊ฑด์— ๋”ฐ๋ฅด๋ฉด '์–‘์ด ๊ฐ€์žฅ ๋งŽ์€ ์•„์ด์Šคํฌ๋ฆผ์ด ์—ฌ๋Ÿฌ ๊ฐœ๋ผ๋ฉด ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” ๊ฒƒ์„ ๋จน๋Š”๋‹ค.'

๋”ฐ๋ผ์„œ ๊ฐ™์€ ์–‘์˜ ์•„์ด์Šคํฌ๋ฆผ์ด ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์„ ๊ฒฝ์šฐ,

๊ฐ€์žฅ ์ž‘์€ ์ธ๋ฑ์Šค(๊ฐ€์žฅ ์™ผ์ชฝ)๋ฅผ ๊ฐ€์ง„ ์•„์ด์Šคํฌ๋ฆผ์„ ๋จน์–ด์•ผ ํ•œ๋‹ค.

 

TreeSet<Integer>์€ ์ธ๋ฑ์Šค๋ฅผ ์ž๋™์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•ด์„œ ์ €์žฅํ•˜๋ฏ€๋กœ,

  • pollFirst() → ๊ฐ€์žฅ ์™ผ์ชฝ ์•„์ด์Šคํฌ๋ฆผ
  • pollLast() → reverse ์ƒํƒœ์ผ ๋•Œ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„์ด์Šคํฌ๋ฆผ
  • ์„ ๊ฐ๊ฐ ๋น ๋ฅด๊ฒŒ ๊บผ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ’ก ์ฐธ๊ณ ๋กœ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•œ putIfAbsent()  ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž๋ฉด, 

putIfAbsent(key, value)๋Š” Java 8 ์ด์ƒ์—์„œ ์ง€์›๋˜๋ฉฐ,

 

  • ํ•ด๋‹น ํ‚ค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด value๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ 
  • ์ด๋ฏธ ์กด์žฌํ•˜๋ฉด ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ํ•จ

์˜ˆ๋ฅผ ๋“ค์–ด, ์–ด๋–ค ์–‘์ด 14์ธ ์•„์ด์Šคํฌ๋ฆผ์ด ์ฒ˜์Œ ๋“ฑ์žฅํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

if (!iceCreams.containsKey(14)) {
    iceCreams.put(14, new TreeSet<>());
}
iceCreams.get(14).add(i);

์ด ์ฝ”๋“œ๋ฅผ ๊ฐ„๋‹จํžˆ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

iceCreams.putIfAbsent(14, new TreeSet<>());
iceCreams.get(14).add(i);

์ฆ‰, amount ์–‘์˜ ์•„์ด์Šคํฌ๋ฆผ ๊ทธ๋ฃน(TreeSet<index>)์ด ์—†์œผ๋ฉด ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ , ์žˆ์œผ๋ฉด ๊ธฐ์กด ๊ฑธ ์‚ฌ์šฉํ•ด์„œ ํ•ด๋‹น ์ธ๋ฑ์Šค i๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค.

 

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

 

โœ” ์ฝ”๋“œ

๋ฉ”๋ชจ๋ฆฌ : 65092KB
์‹œ๊ฐ„ : 620ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.TreeMap;
import java.util.TreeSet;

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

        int n = Integer.parseInt(st.nextToken()); // ์ „์ฒด ์•„์ด์Šคํฌ๋ฆผ์˜ ๊ฐœ์ˆ˜
        int m = Integer.parseInt(st.nextToken()); // ์ง€ํ˜ธ๊ฐ€ ๋จน์„ ์•„์ด์Šคํฌ๋ฆผ์˜ ๊ฐœ์ˆ˜

        // ์•„์ด์Šคํฌ๋ฆผ์˜ ์–‘, ๊ทธ ์–‘์„ ๊ฐ€์ง„ ์•„์ด์Šคํฌ๋ฆผ์˜ ์ธ๋ฑ์Šค๋“ค
        TreeMap<Integer, TreeSet<Integer>> iceCreams = new TreeMap<>();
        st = new StringTokenizer(br.readLine());
        for (int i = 1; i <= n; i++) {
            int amount = Integer.parseInt(st.nextToken());
            // ํ•ด๋‹น ํ‚ค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด value๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ 
            // ์ด๋ฏธ ์กด์žฌํ•˜๋ฉด ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ํ•จ
            iceCreams.putIfAbsent(amount, new TreeSet<>());
            iceCreams.get(amount).add(i);
        }

        StringBuilder sb = new StringBuilder();
        while (m --> 0) {
            TreeSet<Integer> group = iceCreams.lastEntry().getValue(); // ๊ฐ€์žฅ ์–‘ ๋งŽ์€ ๊ทธ๋ฃน

            if (isReverseOrder) { // ์ขŒ์šฐ๋กœ ๋’ค์ง‘์—ˆ๋‹ค๋ฉด
                sb.append(group.pollLast()).append("\n"); // ์˜ค๋ฅธ์ชฝ์—์„œ ๋จน๊ธฐ
            } else {
                sb.append(group.pollFirst()).append("\n"); // ์™ผ์ชฝ์—์„œ ๋จน๊ธฐ
            }

            if (iceCreams.lastKey() % 7 == 0) { // ๋ฏผ์ดˆ๋ฅผ ๋จน์—ˆ๋‹ค๋ฉด
                isReverseOrder = !isReverseOrder;
            }

            if (group.isEmpty()) {
                iceCreams.pollLastEntry(); // ๋จน์€ ๊ทธ๋ฃน ๋‹ค ๋น„์šฐ๋ฉด ์‚ญ์ œ
            }
        }

        System.out.println(sb.toString());

        br.close();
    }
}

 

์ฒ˜์Œ์— Deque๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋Š”๋ฐ ๊ณ„์† ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋–ด๋‹ค..

๋„์ €ํžˆ ์•„์ด๋””์–ด๊ฐ€ ์•ˆ ๋– ์˜ฌ๋ผ์„œ ๋‹ค๋ฅธ ๋ถ„์˜ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ํ’€์—ˆ๋‹ค. ์˜ค๋žœ๋งŒ์— TreeMap๊ณผ TreeSet์„ ์‚ฌ์šฉํ•ด ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋Š”๋ฐ,

์ฒ˜์Œ ๋ณด๋Š” ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด์„œ๋„ ๊ณต๋ถ€ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ์ •๋ ฌ ๋ฌธ์ œ๊ฐ€ ์ œ์ผ ์–ด๋ ค์šธ์ง€๋„ ๋ชจ๋ฅด๊ฒ ๋‹ค...โญ