[Boj_2550] ์ „๊ตฌ

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

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

 

โ–ธ ๋ฌธ์ œ

N๊ฐœ์˜ ์Šค์œ„์น˜์™€ N๊ฐœ์˜ ์ „๊ตฌ๋ฅผ ๊ฐ€์ง„ ํ•˜๋‚˜์˜ ์Šค์œ„์นญ ๋ฐ•์Šค๊ฐ€ ์žˆ๋‹ค. ์ด ๋ฐ•์Šค์˜ ์™ผํŽธ์—๋Š” ์Šค์œ„์น˜๊ฐ€ ์žˆ๊ณ , ์˜ค๋ฅธํŽธ์—๋Š” ์ „๊ตฌ๊ฐ€ ๋‹ฌ๋ ค์žˆ๋‹ค. ๋ชจ๋“  ์Šค์œ„์น˜์™€ ์ „๊ตฌ๋“ค์€ 1์—์„œ๋ถ€ํ„ฐ N๊นŒ์ง€์˜ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง€๋ฉฐ ๊ฐ™์€ ๋ฒˆํ˜ธ์˜ ์Šค์œ„์น˜์™€ ์ „๊ตฌ๋Š” ์ „์„ ์œผ๋กœ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค.

 

ํ•˜๋‚˜์˜ ์Šค์œ„์น˜๋ฅผ ๋ˆ„๋ฅด๋ฉด ๊ทธ ์Šค์œ„์น˜์™€ ์—ฐ๊ฒฐ๋œ ์ „๊ตฌ์— ๋ถˆ์ด ๋“ค์–ด์˜ค๊ฒŒ ๋œ๋‹ค. ๋‘ ๊ฐœ ์ด์ƒ์˜ ์Šค์œ„์น˜๋ฅผ ๊ฐ™์ด ๋ˆ„๋ฅด๋Š” ๊ฒฝ์šฐ, ์ „์„ ์ด ์„œ๋กœ ๋งŒ๋‚˜๋ฉด ๋งŒ๋‚œ ์ „์„ ์— ์—ฐ๊ฒฐ๋œ ์ „๊ตฌ๋“ค์˜ ๋ถˆ์€ ์ผœ์ง€์ง€ ์•Š๋Š”๋‹ค.

์œ„ ๊ทธ๋ฆผ์—์„œ 1๋ฒˆ๊ณผ 4๋ฒˆ์˜ ์Šค์œ„์น˜๋ฅผ ๊ฐ™์ด ๋ˆ„๋ฅด๋ฉด 1๋ฒˆ๊ณผ 4๋ฒˆ์˜ ์ „๊ตฌ์—๋Š” ๋ถˆ์ด ์ผœ์ง€์ง€๋งŒ, 1๋ฒˆ๊ณผ 2๋ฒˆ์˜ ์Šค์œ„์น˜๋ฅผ ๊ฐ™์ด ๋ˆ„๋ฅด๋ฉด 1๋ฒˆ๊ณผ 2๋ฒˆ ์ „๊ตฌ์˜ ๋ถˆ์€ ์ผœ์ง€์ง€ ์•Š๋Š”๋‹ค. 1๋ฒˆ๊ณผ 3๋ฒˆ ๊ทธ๋ฆฌ๊ณ  5๋ฒˆ ์Šค์œ„์น˜๋ฅผ ๊ฐ™์ด ๋ˆ„๋ฅด๋ฉด ์ „์„ ์ด ๋งŒ๋‚˜๋Š” 1๋ฒˆ๊ณผ 5๋ฒˆ ์ „๊ตฌ๋Š” ์ผœ์ง€์ง€ ์•Š์ง€๋งŒ 3๋ฒˆ ์ „๊ตฌ๋Š” ์ผœ์ง€๊ฒŒ ๋œ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์ด ํ•  ์ผ์€ ๊ฐ€์žฅ ๋งŽ์€ ์ „๊ตฌ๊ฐ€ ์ผœ์ง€๋„๋ก ์Šค์œ„์น˜๋ฅผ ๋ˆ„๋ฅด๋Š” ๊ฒƒ์ด๋‹ค. ์œ„ ๊ทธ๋ฆผ์—์„œ๋Š” 3๋ฒˆ๊ณผ 4๋ฒˆ ๊ทธ๋ฆฌ๊ณ  5๋ฒˆ ์Šค์œ„์น˜๋ฅผ ๋ˆ„๋ฅด๋Š” ๊ฒฝ์šฐ์™€ 1๋ฒˆ๊ณผ 3๋ฒˆ ๊ทธ๋ฆฌ๊ณ  4๋ฒˆ์„ ๋ˆ„๋ฅด๋Š” ๊ฒฝ์šฐ์— ์„ธ ๊ฐœ์˜ ์ „๊ตฌ๊ฐ€ ์ผœ์ง€๊ฒŒ ๋˜๊ณ , ์ด ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ์ „๊ตฌ๊ฐ€ ์ผœ์ง€๋Š” ๊ฒฝ์šฐ์ด๋‹ค.

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

 

โ–ธ ์ž…๋ ฅ

์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ์Šค์œ„์น˜์˜ ์ˆ˜(์ „๊ตฌ์˜ ์ˆ˜)๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ N (1 ≤ N ≤ 10,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„์—๋Š” N๊ฐœ์˜ ์Šค์œ„์น˜ ๋ฒˆํ˜ธ๋“ค์ด ์œ„์—์„œ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. ์„ธ ๋ฒˆ์งธ ์ค„์—๋Š” N๊ฐœ์˜ ์ „๊ตฌ ๋ฒˆํ˜ธ๋“ค์ด ์œ„์—์„œ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ๊ฐ€์žฅ ๋งŽ์€ ์ „๊ตฌ๊ฐ€ ์ผœ์ง€๊ฒŒ ํ•˜๋Š” ์Šค์œ„์น˜์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„์—๋Š” ๋ˆŒ๋Ÿฌ์•ผ ํ•˜๋Š” ์Šค์œ„์น˜์˜ ๋ฒˆํ˜ธ๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ(๋ฒˆํ˜ธ๊ฐ€ ์ปค์ง€๋Š” ์ˆœ์„œ)์œผ๋กœ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ํ•˜๋‚˜์˜ ์ค„์— ์ถœ๋ ฅํ•œ๋‹ค. ๋‹จ, ๋‘ ๋ฒˆ์งธ ์ค„์— ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ต์ด ๋‘ ๊ฐ€์ง€ ์ด์ƒ์ผ ๋•Œ์—๋Š” ๊ทธ ์ค‘ ํ•œ ๊ฐ€์ง€๋งŒ ์ถœ๋ ฅํ•œ๋‹ค.

 

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

  • ๐Ÿฅ‡  ๋ฌธ์ œ ๋ ˆ๋ฒจ : ๊ณจ๋“œ 3
  • ๐Ÿ””  ๋ฌธ์ œ ์œ ํ˜• : ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด: o(n log n)
  • ๐Ÿ’ฌ  ํ’€์ด ์–ธ์–ด : JAVA

 

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

์ด ๋ฌธ์ œ๋Š” ์ „์„ ์ด ๊ฒน์น˜์ง€ ์•Š๋„๋ก ํ•˜๋ฉด์„œ ์ „๊ตฌ๊ฐ€ ๊ฐ€์žฅ ๋งŽ์ด ์ผœ์ง€๋„๋ก ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

๋‘ ์ „์„ ์ด ๊ฒน์น˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ๋Š” ์Šค์œ„์น˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ „๊ตฌ์˜ ์ˆœ์„œ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ LIS๋ฅผ ํ™œ์šฉํ•œ๋‹ค.

 

์ „๊ตฌ์˜ ์ธ๋ฑ์Šค 1, 3, 2, 4, 0์—์„œ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ์ฐพ์œผ๋ฉด ๋œ๋‹ค.

์ฆ‰, ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์€ 1, 3, 4 ๋˜๋Š” 1, 2, 4๊ฐ€ ๋  ๊ฒƒ์ด๊ณ , ์ด ์ธ๋ฑ์Šค์— ํ•ด๋‹นํ•˜๋Š” ์ „๊ตฌ์˜ ๋ฒˆํ˜ธ์ธ 4, 5, 3 ๋˜๋Š” 4, 1, 3 ์ค‘ ํ•˜๋‚˜๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ถœ๋ ฅํ•ด ์ฃผ๋ฉด ๋‹ต์ด ๋œ๋‹ค.

 

๋จผ์ €, HashMap<Integer, Integer>์„ ์ด์šฉํ•ด ์Šค์œ„์น˜์˜ ๋ฒˆํ˜ธ์™€ ์ธ๋ฑ์Šค๋ฅผ ์ €์žฅํ•œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์ „๊ตฌ๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ , ์ด๋ฅผ ์Šค์œ„์น˜์™€ ์—ฐ๊ฒฐํ•ด ์ค€๋‹ค.

๋งŒ์•ฝ, 4๋ฒˆ ์ „๊ตฌ๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค๋ฉด ์ด์— ํ•ด๋‹นํ•˜๋Š” ์Šค์œ„์น˜์˜ ์ธ๋ฑ์Šค์ธ 1์„ ์ €์žฅํ•œ๋‹ค.

 

์ด์ œ, ์ด๋ถ„ ํƒ์ƒ‰์„ ํ™œ์šฉํ•ด ์ „๊ตฌ์˜ ์ธ๋ฑ์Šค์— ๋Œ€ํ•ด LIS๋ฅผ ์ฐพ์•„์ค€๋‹ค.

์ด๋•Œ, ์›๋ž˜์˜ ์Šค์œ„์น˜ ์ •๋ณด๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด LIS์— ์ €์žฅ๋˜๋Š” ์ „๊ตฌ์™€ ์ธ๋ฑ์Šค์˜ ์ •๋ณด๋ฅผ Node[] node์— ์ €์žฅํ•œ๋‹ค.

 

๋งˆ์ง€๋ง‰์œผ๋กœ, LIS๋ฅผ ์ˆ˜ํ–‰ํ•œ ์ „๊ตฌ์˜ ์ธ๋ฑ์Šค์™€ list์˜ ์ธ๋ฑ์Šค๋ฅผ ๋น„๊ตํ•˜๋ฉฐ ์ „๊ตฌ์— ๋Œ€ํ•œ ์Šค์œ„์น˜ ์ •๋ณด๋ฅผ ์ฐพ๋Š”๋‹ค.

๋งŒ์•ฝ, ํ˜„์žฌ ์ „๊ตฌ์˜ ์ธ๋ฑ์Šค๊ฐ€ 1๋ฒˆ์ด๋ผ๋ฉด ์ด์— ํ•ด๋‹นํ•˜๋Š” ์Šค์œ„์น˜๋Š” 4๋ฒˆ ์Šค์œ„์น˜๋ฏ€๋กœ 4๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

๋ณ€๊ฒฝ๋œ list๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ ๋’ค ์ถœ๋ ฅํ•œ๋‹ค.

 

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

 

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

๋ฉ”๋ชจ๋ฆฌ : 19404KB
์‹œ๊ฐ„ : 204ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.StringTokenizer;

public class Main {
    static int n;
    static int[] switches, lights;
    static ArrayList<Integer> list;
    static Node[] node;
    static public class Node {
        int num; int idx;
        public Node (int num, int idx) {
            this.num = num; this.idx = idx;
        }
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());

        HashMap<Integer, Integer> map = new HashMap<>(); // ์Šค์œ„์น˜ ๋ฒˆํ˜ธ, ์ธ๋ฑ์Šค

        StringTokenizer st = new StringTokenizer(br.readLine());
        switches = new int[n];
        for (int i = 0; i < n; i++) {
            switches[i] = Integer.parseInt(st.nextToken());
            map.put(switches[i], i);
        }
        lights = new int[n];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            lights[i] = map.get(Integer.parseInt(st.nextToken()));
        }

        getLis();

        StringBuilder sb = new StringBuilder();
        sb.append(list.size()).append("\n");

        Collections.sort(list);
        for (int i : list) {
            sb.append(i).append(" ");
        }

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

    private static void getLis() {
        list = new ArrayList<>();
        node = new Node[n];
        int idx;
        for (int i = 0; i < n; i++) {
            if (list.size() == 0 || list.get(list.size()-1) < lights[i]) {
                list.add(lights[i]);
                node[i] = new Node(lights[i], list.size()-1);
            } else {
                idx = binarySearch(0, list.size()-1, lights[i]);
                list.set(idx, lights[i]);
                node[i] = new Node(lights[i], idx);
            }
        }

        idx = list.size()-1;
        for (int i = n-1; i >= 0; i--) {
            if (node[i].idx == idx) {
                list.set(idx--, switches[node[i].num]);
            }
        }
    }

    private static int binarySearch(int start, int end, int target) {
        int mid;
        while (start <= end) {
            mid = (start + end)/2;
            if (list.get(mid) < target) start = mid+1;
            else end = mid-1;
        }
        return start;
    }
}

 

ํ•ด๊ฒฐ ์™„๋ฃŒ ! ๐Ÿ”ฅ