[Boj_12014] ์ฃผ์‹, LIS

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

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

 

โ–ธ ๋ฌธ์ œ

์–ด๋А ๋‚  ๋‹น์‹ ์€ ์ถœ๊ทผ๊ธธ์—, ์ง€ํ•˜์ฒ ์—ญ ์“ฐ๋ ˆ๊ธฐํ†ต์—์„œ ๋†€๋ผ์šด ๋ฌธ์„œ๋ฅผ ์–ป๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด ๋ฌธ์„œ๋Š” ๋ฏธ๋ž˜์˜ ์–ด๋–ค ํšŒ์‚ฌ์˜ ์ฃผ์‹ ๊ฐ€๊ฒฉ์˜ ๋ณ€๋™์ด ๋‹ด๊ฒจ ์žˆ์—ˆ๋‹ค. ์„ค๋งˆ ํ•˜๋Š” ๋งˆ์Œ์œผ๋กœ ์ด ํšŒ์‚ฌ์˜ ์ฃผ์‹ ๊ฐ€๊ฒฉ์˜ ๋ณ€๋™์„ ๋ณธ ๊ฒฐ๊ณผ, ๋ฌธ์„œ์— ๋‹ด๊ธด ๋‚ด์šฉ์ด ์‚ฌ์‹ค์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ์•„๋งˆ๋„ ๋ฏธ๋ž˜์—์„œ ํƒ€์ž„๋จธ์‹ ์„ ํƒ€๊ณ  ์˜จ ํ›„์†์ด ์„ ์กฐ๋ฅผ ๋•๊ธฐ ์œ„ํ•ด์„œ ๋ณด๋‚ธ ๊ฒƒ์ด ์•„๋‹๊นŒ ํ•˜๋Š” ๋งˆ์Œ์ด ๋“ค์—ˆ๋‹ค.

์•ž์œผ๋กœ N ์ผ๊ฐ„ ์ฃผ์‹ ๊ฐ€๊ฒฉ์ด N ๊ฐœ์˜ ์ˆซ์ž๋กœ ์ฃผ์–ด์ ธ ์žˆ๋‹ค. ๋‹น์‹ ์€ ์ง€๊ธˆ๊นŒ์ง€ ์ฃผ์‹์ด๋ผ๋Š” ๊ฒƒ์„ ๊ฑฐ๋ž˜ํ•ด๋ณธ ์ ์ด ์—†๊ธฐ ๋Œ€๋ฌธ์—, ์ฆ๊ถŒํšŒ์‚ฌ์— ๊ฐ€์„œ ๊ฑฐ๋ž˜๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ๋ฏธ๋ž˜๋ฅผ ์•Œ๋ฉด์„œ ์ฃผ์‹์„ ๊ฑฐ๋ž˜ํ•œ๋‹ค๋ฉด ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์˜์‹ฌํ• ์ง€๋„ ๋ชจ๋ฅธ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด์„œ, ์ด K ๋ฒˆ ์ฃผ์‹์„ ์‚ฌ๊ธฐ๋กœ ํ–ˆ๋‹ค. ํ•˜๋ฃจ์—๋Š” ์ฃผ์‹์„ ํ•œ ๋ฒˆ๋งŒ ์‚ด์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ฃผ์‹์„ ์‚ฌ๋Š” ๋‚ ์€ ์ด K ์ผ์ด๋‹ค.

์˜์‹ฌ์„ ๋” ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ, ์ฃผ์‹์„ ์‚ด ๋•Œ๋งˆ๋‹ค ๋งจ ์ฒ˜์Œ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ฐ”๋กœ ์ง์ „์— ์ฃผ์‹์„ ์ƒ€์„ ๋•Œ๋ณด๋‹ค ๊ฐ€๊ฒฉ์ด ์˜ฌ๋ผ๊ฐ”์„ ๋•Œ๋งŒ ์‚ฌ๊ธฐ๋กœ ํ–ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 10์ผ๊ฐ„ ์ฃผ๊ฐ€์˜ ๋ณ€๋™์ด ๋‹ค์Œ ํ‘œ์™€ ๊ฐ™๋‹ค๊ณ  ํ•˜์ž.

 

1 2 3 4 5 6 7 8 9 10
100 50 70 90 75 87 105 78 110 60

K=3์ด๋ผ๋ฉด, 2์ผ, 3์ผ, 4์ผ์— ์ฃผ์‹์„ ์‚ฌ๋ฉด ๊ทธ๋‚ ์˜ ์ฃผ๊ฐ€๋Š” 50, 70, 90์ด๊ธฐ ๋Œ€๋ฌธ์— ์ฃผ์–ด์ง„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•œ๋‹ค. ๋งŒ์•ฝ K=6์ด๋ผ๋ฉด, 2์ผ, 3์ผ, 5์ผ, 6์ผ, 7์ผ, 9์ผ์— ์ฃผ์‹์„ ์‚ฌ๋ฉด ์ฃผ๊ฐ€๊ฐ€ 50, 70, 75, 87, 105, 110์ด๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์–ด์ง„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•œ๋‹ค. K=10์ด๋ผ๋ฉด ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ์ˆ˜ ์—†๋‹ค.

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

 

โ–ธ ์ž…๋ ฅ

์ž…๋ ฅ ํŒŒ์ผ์—๋Š” ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ๋‹ค. ํŒŒ์ผ์˜ ์ฒซ์งธ ์ค„์— ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ T(2 ≤ T ≤ 100)๊ฐ€ ์ฃผ์–ด์ง€๊ณ , ์ดํ›„ ์ฐจ๋ก€๋กœ T ๊ฐœ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ฒซ ์ค„์— ๋‘ ์ •์ˆ˜ N๊ณผ K์ด ์ฃผ์–ด์ง„๋‹ค. N์€ ์•ž์œผ๋กœ ์ฃผ๊ฐ€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋‚  ์ˆ˜์ด๋ฉฐ, (1 ≤ N ≤ 10,000) K๋Š” ๊ฑฐ๋ž˜์˜ ํšŒ์ˆ˜์ด๋‹ค. (1 ≤ K ≤ 10,000) ๋‹ค์Œ ์ค„์—๋Š” ์•ž์œผ๋กœ N ๋‚ ์˜ ์ฃผ๊ฐ€๊ฐ€ ์‚ฌ์ด์— ๊ณต๋ฐฑ์„ ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. ์ฃผ๊ฐ€๋Š” 1๋ถ€ํ„ฐ 10,000 ์‚ฌ์ด์˜ ์ •์ˆ˜์ด๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด์„œ ์ถœ๋ ฅ์€ ํ•œ ์ค„๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. T ๋ฒˆ์งธ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด์„œ๋Š” ์ฒซ์งธ ์ค„์—๋Š” "Case #T"๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„์—๋Š” ์ฃผ์–ด์ง„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๊ฒŒ ์ฃผ์‹์„ ์‚ด ์ˆ˜ ์žˆ์œผ๋ฉด 1, ์•„๋‹ˆ๋ฉด 0์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

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

  • ๐Ÿฅ‡  ๋ฌธ์ œ ๋ ˆ๋ฒจ : ๊ณจ๋“œ 2
  • ๐Ÿ””  ๋ฌธ์ œ ์œ ํ˜• : ์ด๋ถ„ ํƒ์ƒ‰, ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด: o(n log n)
  • ๐Ÿ’ฌ  ํ’€์ด ์–ธ์–ด : JAVA

 

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

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

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด(LIS)์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•œ ๋’ค, ๊ทธ ๊ฐ’์ด k ์ด์ƒ์ธ์ง€ ๋น„๊ตํ•˜๋ฉด ๋œ๋‹ค. ์ด๋•Œ, LIS์˜ ๊ธธ์ด๋Š” ์ด๋ถ„ ํƒ์ƒ‰์„ ํ™œ์šฉํ•˜๋ฉด O(N log N)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด(LIS)๋ž€?

LIS(Longest Increasing Subsequence)๋ž€, ์ฃผ์–ด์ง„ ์ˆ˜์—ด์—์„œ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ๊ฐ€์žฅ ๊ธด ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๋•Œ, ๋ถ€๋ถ„ ์ˆ˜์—ด์€ ๋ฐ˜๋“œ์‹œ ์—ฐ์†์ ์ผ ํ•„์š” ์—†์œผ๋ฉฐ, ์œ ์ผํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

arr 2 1 3 5 4

์œ„์™€ ๊ฐ™์€ ์ˆ˜์—ด์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

memo 2        

๋จผ์ €, LIS๋ฅผ ์ €์žฅํ•  memo ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ, arr[0]์˜ ๊ฐ’์„ memo ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ๊ฐ’์œผ๋กœ ๋„ฃ๋Š”๋‹ค.

memo 1        

arr[1] = 1์ผ๋•Œ, ํ˜„์žฌ memo์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’์ธ 2๋ณด๋‹ค 1์ด ์ž‘๋‹ค.

์ด ๊ฒฝ์šฐ, ์ด๋ถ„ ํƒ์ƒ‰์„ ์‚ฌ์šฉํ•ด ๋“ค์–ด๊ฐˆ ์œ„์น˜์ธ 0๋ฒˆ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๊ณ , ํ•ด๋‹น ์œ„์น˜์˜ ๊ฐ’์„ ๊ต์ฒดํ•œ๋‹ค.

memo 1 3      

arr[2] = 3 ์ผ๋•Œ, ํ˜„์žฌ memo ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’์ธ  1๋ณด๋‹ค 3์ด ํฌ๋‹ค.

์ด ๊ฒฝ์šฐ, ๋ฐ”๋กœ ๋งจ ๋’ค์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

memo 1 3 5    

arr[3] = 5์ผ๋•Œ, ํ˜„์žฌ  memo ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’์ธ 3๋ณด๋‹ค 5๊ฐ€ ํฌ๋‹ค.

์ด ๊ฒฝ์šฐ, ๋ฐ”๋กœ ๋งจ ๋’ค์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

memo 1 3 4    

arr[4] = 4์ผ๋•Œ, ํ˜„์žฌ  memo ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’์ธ 5๋ณด๋‹ค 4๊ฐ€ ์ž‘๋‹ค.

์ด ๊ฒฝ์šฐ, ์ด๋ถ„ ํƒ์ƒ‰์„ ์‚ฌ์šฉํ•ด ๋“ค์–ด๊ฐˆ ์œ„์น˜์ธ 2๋ฒˆ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๊ณ , ํ•ด๋‹น ์œ„์น˜์˜ ๊ฐ’์„ ๊ต์ฒดํ•œ๋‹ค.

 

์ตœ์ข…์ ์œผ๋กœ memo = {1, 3, 4}์ด๋ฏ€๋กœ, LIS์˜ ๊ธธ์ด๋Š” 3์ด๋‹ค.

 

์ฆ‰, LIS๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์ƒˆ๋กœ์šด ์›์†Œ๊ฐ€ ๋“ค์–ด๊ฐˆ ์œ„์น˜๋ฅผ ์ด๋ถ„ ํƒ์ƒ‰์œผ๋กœ ์ฐพ์•„ ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜ ๊ต์ฒดํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ LIS๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

 

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

 

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

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

public class Main {
    static int n, k;
    static int[] stock;
    static int[] memo; // LIS๋ฅผ ์ €์žฅํ•  ๋ฐฐ์—ด
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;
        int tIdx = 1;
        while (t --> 0) {
            sb.append("Case #").append(tIdx++).append("\n");
            st = new StringTokenizer(br.readLine());
            n = Integer.parseInt(st.nextToken()); // ์•ž์œผ๋กœ ์ฃผ๊ฐ€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋‚  ์ˆ˜
            k = Integer.parseInt(st.nextToken()); // ๊ฑฐ๋ž˜์˜ ํšŒ์ˆ˜

            stock = new int[n];
            st = new StringTokenizer(br.readLine());
            for (int i = 0; i < n; i++) {
                stock[i] = Integer.parseInt(st.nextToken());
            }
            memo = new int[n+1];
            int len = 0; // LIS ๊ธธ์ด
            int idx; // ์ธ๋ฑ์Šค
            for (int i = 0; i < n; i++) {
                // ์ฃผ์‹ ๊ฐ€๊ฒฉ์ด ํ˜„์žฌ LIS์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’๋ณด๋‹ค ํฌ๋ฉด, LIS ๊ธธ์ด๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ ๊ฐ€๊ฒฉ์„ ์ถ”๊ฐ€
                if (stock[i] > memo[len]) {
                    len += 1;
                    memo[len] = stock[i];
                } else {
                    // ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ์ด๋ถ„ ํƒ์ƒ‰์„ ํ†ตํ•ด ๋“ค์–ด๊ฐˆ ์œ„์น˜๋ฅผ ์ฐพ์•„ ํ•ด๋‹น ์œ„์น˜์˜ ๊ฐ’์„ ๊ต์ฑ„
                    idx = binarySearch(0, len, stock[i]);
                    memo[idx] = stock[i];
                }
            }

            // LIS์˜ ๊ธธ์ด๊ฐ€ k ์ด์ƒ์ด๋ฉด 1์„ ์ถœ๋ ฅ, ์•„๋‹ˆ๋ฉด 0์„ ์ถœ๋ ฅ
            if (len >= k) sb.append(1).append("\n");
            else sb.append(0).append("\n");
        }

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

    // memo ๋ฐฐ์—ด์—์„œ target์ด ๋“ค์–ด๊ฐˆ ์œ„์น˜๋ฅผ ์ฐพ์Œ
    private static int binarySearch(int start, int end, int target) {
        int mid;
        while (start < end) {
            mid = start+(end-start)/2;
            if (memo[mid] < target) {
                start = mid+1;
            } else end = mid;
        }
        
        return end;
    }
}

 

์ตœ๊ทผ์— ์ด๋ถ„ ํƒ์ƒ‰์œผ๋กœ ๋‹ค์‹œ ํ’€์—ˆ๋˜ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด ๋ฌธ์ œ์™€ ๊ฐ™์€ ๋ฌธ์ œ์˜€๋‹ค. 

์ฒ˜์Œ์—๋Š” ์ด๋ถ„ ํƒ์ƒ‰์„ ํ™œ์šฉํ•ด์„œ LIS๋ฅผ ๊ตฌํ•˜๋Š” ํ’€์ด๊ฐ€ ์ž˜ ์ดํ•ด ์•ˆ ๊ฐ”๋Š”๋ฐ, ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ํ’€์ด๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๊ณผ์ •์—์„œ ํ™•์‹คํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์–ด ์ข‹์•˜๋‹ค. ํ•ด๊ฒฐ ์™„๋ฃŒ ! ๐Ÿ˜Ž

 

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

[Boj_2550] ์ „๊ตฌ  (0) 2025.02.20
[Boj_2696] ์ค‘์•™๊ฐ’ ๊ตฌํ•˜๊ธฐ  (0) 2025.02.15
[Boj_22254] ๊ณต์ • ์ปจ์„คํ„ดํŠธ ํ˜ธ์„  (1) 2025.02.07
[Boj_5214] ํ™˜์Šน  (0) 2025.01.31
[Boj_16509] ์žฅ๊ตฐ  (0) 2025.01.30