๐Ÿ† [Baekjoon / Java] 16566. ์นด๋“œ ๊ฒŒ์ž„

์ดํ•˜์–€ยท2024๋…„ 12์›” 15์ผ
1

๐Ÿฃ ๋ฐฑ์ค€

๋ชฉ๋ก ๋ณด๊ธฐ
35/37

๋ฌธ์ œ ์„ค๋ช…


๐Ÿ’ก Info

๋‚ด์šฉ

์ฒ ์ˆ˜์™€ ๋ฏผ์ˆ˜๋Š” ์นด๋“œ ๊ฒŒ์ž„์„ ์ฆ๊ฒจํ•œ๋‹ค. ์ด ์นด๋“œ ๊ฒŒ์ž„์˜ ๊ทœ์น™์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. N๊ฐœ์˜ ๋นจ๊ฐ„์ƒ‰ ์นด๋“œ๊ฐ€ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ์นด๋“œ๋Š” ์ˆœ์„œ๋Œ€๋กœ 1๋ถ€ํ„ฐ N๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ๋‹ค. ์ด ์ค‘์—์„œ M๊ฐœ์˜ ์นด๋“œ๋ฅผ ๊ณ ๋ฅธ๋‹ค.
  2. N๊ฐœ์˜ ํŒŒ๋ž€์ƒ‰ ์นด๋“œ๊ฐ€ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ์นด๋“œ๋Š” ์ˆœ์„œ๋Œ€๋กœ 1๋ถ€ํ„ฐ N๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ๋‹ค. ์ด ์ค‘์—์„œ ๋นจ๊ฐ„์ƒ‰์—์„œ ๊ณ ๋ฅธ ๋ฒˆํ˜ธ์™€ ๊ฐ™์€ ํŒŒ๋ž€์ƒ‰ ์นด๋“œ M๊ฐœ๋ฅผ ๊ณ ๋ฅธ๋‹ค.
  3. ์ฒ ์ˆ˜๋Š” ๋นจ๊ฐ„์ƒ‰ ์นด๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ๋ฏผ์ˆ˜๋Š” ํŒŒ๋ž€์ƒ‰ ์นด๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค.
  4. ์ฒ ์ˆ˜์™€ ๋ฏผ์ˆ˜๋Š” ๊ณ ๋ฅธ ์นด๋“œ ์ค‘์— 1์žฅ์„ ๋’ค์ง‘์–ด์ง„ ์ƒํƒœ๋กœ ๋‚ธ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์นด๋“œ๋ฅผ ๋‹ค์‹œ ๋’ค์ง‘์–ด์„œ ๋ฒˆํ˜ธ๊ฐ€ ํฐ ์‚ฌ๋žŒ์ด ์ด๊ธด๋‹ค. ์ด ๋™์ž‘์„ K๋ฒˆ ํ•ด์„œ ๋” ๋งŽ์ด ์ด๊ธด ์‚ฌ๋žŒ์ด ์ตœ์ข…์ ์œผ๋กœ ์Šน๋ฆฌํ•œ๋‹ค. ํ•œ ๋ฒˆ ๋‚ธ ์นด๋“œ๋Š” ๋ฐ˜๋“œ์‹œ ๋ฒ„๋ ค์•ผ ํ•œ๋‹ค.
    ์ฒ ์ˆ˜๋Š” ๋›ฐ์–ด๋‚œ ๋งˆ์ˆ ์‚ฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณธ์ธ์ด ๋‚ผ ์นด๋“œ๋ฅผ ๋งˆ์Œ๋Œ€๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์นด๋“œ๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ๋ฏผ์ˆ˜ ๋ชฐ๋ž˜ ๋‹ค์‹œ ๋“ค๊ณ  ์˜จ๋‹ค๊ฑฐ๋‚˜ ๋ฏผ์ˆ˜ํ•œํ…Œ ์—†๋Š” ์นด๋“œ๋ฅผ ๋‚ด๊ธฐ๋„ ํ•œ๋‹ค.

๋ฏผ์ˆ˜๋Š” ๋›ฐ์–ด๋‚œ ์‹ฌ๋ฆฌํ•™์ž์ด๊ธฐ ๋•Œ๋ฌธ์— ์ฒ ์ˆ˜๊ฐ€ ๋‚ผ ์นด๋“œ๋ฅผ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฏผ์ˆ˜๋Š” ์ฒ ์ˆ˜๊ฐ€ ๋‚ผ ์นด๋“œ๋ณด๋‹ค ํฐ ์นด๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ ์นด๋“œ๋“ค ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ์นด๋“œ๋ฅผ ๋‚ด๊ธฐ๋กœ ํ–ˆ๋‹ค.

K๋ฒˆ ๋™์•ˆ ์ฒ ์ˆ˜๊ฐ€ ๋‚ผ ์นด๋“œ๊ฐ€ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋ฏผ์ˆ˜๊ฐ€ ์–ด๋–ค ์นด๋“œ๋ฅผ ๋‚ผ์ง€ ์ถœ๋ ฅํ•˜๋ผ. ๋‹จ, ๋ฏผ์ˆ˜๊ฐ€ ์นด๋“œ๋ฅผ ๋‚ด์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

๐Ÿ“ฅ์ž…๋ ฅ ์กฐ๊ฑด

  • ์ฒซ์งธ ์ค„์— ์„ธ ๊ฐœ์˜ ์ž์—ฐ์ˆ˜ N, M, K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 โ‰ค M โ‰ค N โ‰ค 4,000,000, 1 โ‰ค K โ‰ค min(M, 10,000))
  • ๋‹ค์Œ ์ค„์— ์นด๋“œ์˜ ๋ฒˆํ˜ธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” M๊ฐœ์˜ ์ž์—ฐ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ๊ฐ์˜ ์ˆ˜๋“ค์€ 1 ์ด์ƒ์ด๊ณ  N ์ดํ•˜์ด๋ฉฐ ์„œ๋กœ ๋‹ค๋ฅด๋‹ค.
  • ๋‹ค์Œ ์ค„์— K๊ฐœ์˜ ์ž์—ฐ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. i๋ฒˆ์งธ ์ˆ˜๋Š” ์ฒ ์ˆ˜๊ฐ€ i๋ฒˆ์งธ๋กœ ๋‚ด๋Š” ์นด๋“œ์˜ ๋ฒˆํ˜ธ์ด๋‹ค. ์ฒ ์ˆ˜๊ฐ€ ๋‚ด๋Š” ์นด๋“œ ์—ญ์‹œ 1 ์ด์ƒ N ์ดํ•˜์ด๋‹ค.
10 7 5
2 5 3 7 8 4 9
4 1 1 3 8

๐Ÿ“ค์ถœ๋ ฅ ์กฐ๊ฑด

  • K์ค„์— ๊ฑธ์ณ์„œ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. i๋ฒˆ์งธ ์ค„์—๋Š” ๋ฏผ์ˆ˜๊ฐ€ i๋ฒˆ์งธ๋กœ ๋‚ผ ์นด๋“œ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•œ๋‹ค.
5
2
3
4
9


๋ฌธ์ œ ์ดํ•ด


  • ์ƒ๋Œ€์˜ ์นด๋“œ๋ณด๋‹ค ํฐ ์นด๋“œ๋“ค ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ์นด๋“œ๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ
    • ์นด๋“œ์˜ ๋ฒ”์œ„๊ฐ€ ๋„“์€ ์ƒํƒœ์—์„œ ๊ทธ๋ฆฌ๋””๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๋ฐฉ์‹(์ด์ง„ ํƒ์ƒ‰, ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ ๋“ฑ)์œผ๋กœ์˜ ํ’€์ด๊ฐ€ ํ•„์š”


์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฐ ์ตœ์ข… ํ’€์ด


์‹ค์ œ ํ’€์ด ์‹œ๊ฐ„ : 1์‹œ๊ฐ„ 10๋ถ„(์ฒซ ํ’€์ด ์‹œ๊ฐ„ ํฌํ•จ)

  • ์ž…๋ ฅ

    • ์นด๋“œ ์ •๋ณด ์ž…๋ ฅ(N, M, K)
    • ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ, ์ดˆ๊ธฐํ™”
  • ๊ณ„์‚ฐ

    • ์ด์ง„ ํƒ์ƒ‰์„ ์ด์šฉํ•ด ์ž…๋ ฅ๋˜์–ด ์žˆ๋˜ ์นด๋“œ๋ณด๋‹ค ํฐ ์นด๋“œ ์ธ๋ฑ์Šค ์ฐพ๊ธฐ(findCard)
    • Union-Find๋ฅผ ํ†ตํ•ด ์‹ค์ œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์นด๋“œ ์ธ๋ฑ์Šค ํ™•์ธ(find)]
    • ์‚ฌ์šฉ๋œ ์นด๋“œ ์ œ๊ฑฐ(union)
  • ์ถœ๋ ฅ

    • ๊ฒฐ๊ณผ ํ•œ๋ฒˆ์— ์ถœ๋ ฅ(sb)
import java.io.*;
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 = new StringTokenizer(br.readLine(), " ");
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());

        int[] cards = new int[M];
        st = new StringTokenizer(br.readLine(), " ");
        for (int i = 0; i < M; i++) {
            cards[i] = Integer.parseInt(st.nextToken());
        }
        Arrays.sort(cards);

        int[] parent = new int[M];
        for (int i = 0; i < M; i++) {
            parent[i] = i;
        }

        st = new StringTokenizer(br.readLine(), " ");
        for (int i = 0; i < K; i++) {
            int pick = Integer.parseInt(st.nextToken());
            int index = findCard(cards, pick);
            int availableIndex = find(parent, index);
            sb.append(cards[availableIndex]).append("\n");
            union(parent, availableIndex, availableIndex + 1);
        }

        System.out.print(sb);
    }

    private static int findCard(int[] cards, int pick) {
        int low = 0, high = cards.length - 1;
        while (low <= high) {
            int mid = (low + high) / 2;
            if (cards[mid] <= pick) {
                low = mid + 1;
            } else {
                high = mid - 1;
            }
        }
        return low;
    }

    private static int find(int[] parent, int x) {
        if (parent[x] == x) {
            return x;
        }
        return parent[x] = find(parent, parent[x]);
    }

    private static void union(int[] parent, int x, int y) {
        if (y < parent.length) {
            parent[x] = find(parent, y);
        }
    }
}

profile
์–ธ์  ๊ฐ€ ๋‚ด ์ฝ”๋“œ๋กœ ์„ธ์ƒ์— ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๋„๋ก, BE&Data Science ๊ฐœ๋ฐœ ๊ธฐ๋ก ๋…ธํŠธโ˜˜๏ธ

0๊ฐœ์˜ ๋Œ“๊ธ€