๋ฐฑ์ค€ 2565๋ฒˆ : ์ „๊นƒ์ค„ (Java)

์ด ๊ธ€์˜ ๋ชฉ์ฐจ8๊ฐœ
  1. โŒ ์•„์ด๋””์–ด๋ฅผ ๋– ์˜ฌ๋ฆฌ์ง€ ๋ชปํ•จ
  2. ๐Ÿ’ก ํ•„์š”ํ•œ ์•„์ด๋””์–ด
  3. ๐Ÿฅฒ ๊ทธ๋Ÿฌ๋‚˜ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋Š”..
  4. โœจ LIS๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ 
  5. โœ”๏ธ ์ ํ™”์‹ ์ •๋ฆฌ
  6. โœ… ๋ฌธ์ œ์—์„œ ์ž…๋ ฅ ๊ฐ’์ด ์ปค์ง„๋‹ค๋ฉด?
  7. ๐Ÿ–ฅ๏ธ ํ’€์ด ์ฝ”๋“œ (Java)
  8. โฐ ์‹œ๊ฐ„๋ณต์žก๋„

๐Ÿ”Œ ๋ฐฑ์ค€ 2565๋ฒˆ : ์ „๊นƒ์ค„

์„œ๋กœ ๊ต์ฐจํ•˜์ง€ ์•Š๊ฒŒ ์ „๊นƒ์ค„์„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ

๐Ÿ”— ๋ฐฑ์ค€ 2565๋ฒˆ - ์ „๊นƒ์ค„


โŒ ์•„์ด๋””์–ด๋ฅผ ๋– ์˜ฌ๋ฆฌ์ง€ ๋ชปํ•จ

๋‚ด๊ฐ€ ์ œ์ผ ์ž์‹  ์—†๋Š” DP๋ฌธ์ œ์˜€๊ณ , ํ•ต์‹ฌ ์•„์ด๋””์–ด๋ฅผ ๋– ์˜ฌ๋ฆฌ์ง€ ๋ชปํ–ˆ๋‹ค.

๋ฌธ์ œ ํƒœ๊ทธ๋ฅผ ํ™•์ธํ•ด DP๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Œ์—๋„, DP ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์— ๋งค๋ชฐ๋˜์–ด ๋‹ค๋ฅธ ์•„์ด๋””์–ด๋ฅผ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.


๐Ÿ’ก ํ•„์š”ํ•œ ์•„์ด๋””์–ด

๋ฌธ์ œ์—์„œ๋Š” **์ตœ์žฅ ์ฆ๊ฐ€ ์ˆ˜์—ด (LIS, Longest Increasing Subsequence)**์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

์Šฌํސ๋˜ ๊ฒƒ์€, ๋‚˜๋Š” LIS ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

LIS๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์•Œ๊ณ  ์žˆ์—ˆ์œผ๋ฉฐ, ์ž…๋ ฅ ๊ฐ’์ด ๋งŽ์€ ๊ฒฝ์šฐ์— ์ด์ง„ํƒ์ƒ‰์„ ์ ‘๋ชฉํ•˜์—ฌ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•๋„ ์•Œ๊ณ  ์žˆ๋Š” ์ƒํƒœ์˜€๋‹ค.

๋ฐฑ์ค€ - ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด ์‹œ๋ฆฌ์ฆˆ


๐Ÿฅฒ ๊ทธ๋Ÿฌ๋‚˜ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋Š”..

์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ์— ์ถœ์ œ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋งŽ์ง€ ์•Š๋‹ค.

BFS, DFS, ์ด์ง„ํƒ์ƒ‰, ๋ธŒ๋ฃจํŠธ ํฌ์Šค ๋“ฑโ€ฆ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž์ฒด๋ฅผ ์ตํžˆ๋Š” ๊ฒƒ์€ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ ์šฐ๋ฆฌ์˜ ๋ฐœ๋ชฉ์„ ์žก๋Š” ๊ฒƒ์€ ๊ตฌํ˜„๊ณผ DP์—์„œ ์š”๊ตฌํ•˜๋Š”

๊ทธ๋ž˜์„œ ์ด ๋ฌธ์ œ์— ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์“ธ๊ฑด๋ฐ?

๋ผ๋Š” ๋ฌผ์Œ์— ์˜ฌ๋ฐ”๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ฑ„ํƒํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๊ณ ๋“ฑํ•™๊ต ์ˆ˜ํ•™ ๋ฌธ์ œ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ตํ˜”๋‹ค๋ฉด ๊ทธ ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ๋งŽ์€ ๋ฌธ์ œ๋“ค์„ ์ ‘ํ•˜๋ฉฐ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋– ์˜ฌ๋ฆฌ๋Š” ์—ฐ์Šต์ด ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.


โœจ LIS๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ 

LIS๋Š” ๋ฐฐ์—ด์—์„œ ๊ฐ€์žฅ ๊ธด ์˜ค๋ฆ„์ฐจ์ˆœ ๋ถ€๋ถ„ ๋ฐฐ์—ด์„ ์ฐพ๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์ œ์—์„œ LIS๋ฅผ ์™œ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”์ง€ ๋– ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์ด ์–ด๋ ต๋‹ค.

๋ฌธ์ œ ์˜ˆ์‹œ์—์„œ A๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ํ™•์ธํ•˜๋ฉฐ ๋งค์นญ๋˜๋Š” B๊ฐ’์„ ๋ณด์ž.

{8, 2, 9, 1, 4, 6, 7, 10} ์ธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ค„์ด ๊ฒน์น˜์ง€ ์•Š๊ฒŒ ํ•˜๋ ค๋ฉด (1, 8), (3, 9), (4, 1) ์Œ์„ ์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค.

์ดํ›„ ๋‚จ๋Š” ๋ฐฐ์—ด์€ {2, 4, 6, 7}์ด ๋œ๋‹ค.

์ฆ‰, ์ด ๋ฌธ์ œ์—์„œ ์ค„์ด ๊ฒน์น˜์ง€ ์•Š๋Š”๋‹ค -> ๊ฐ€์žฅ ๊ธด ์˜ค๋ฆ„์ฐจ์ˆœ ๋ถ€๋ถ„ ๋ฐฐ์—ด์„ ์ฐพ๋Š”๋‹ค.

๋ผ๋Š” ๊ฒฐ๋ก ์ด ๋‚˜์˜จ๋‹ค.


โœ”๏ธ ์ ํ™”์‹ ์ •๋ฆฌ

  • ๋ฆฌ์ŠคํŠธ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ, ์ƒˆ๋กœ์šด ๊ฐ’์ด ๊ธฐ์กด ๋ฆฌ์ŠคํŠธ ๋งˆ์ง€๋ง‰ ๊ฐ’๋ณด๋‹ค ํฌ๋ฉด ์ถ”๊ฐ€
  • ์•„๋‹ˆ๋ผ๋ฉด, ํ•ด๋‹น ๊ฐ’๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ์ตœ์ดˆ์˜ ์œ„์น˜๋ฅผ ์ฐพ์•„ ํ•ด๋‹น ๊ฐ’์„ ๋Œ€์ฒด
if (number[i] > list.get(list.size() - 1)) {
    list.add(number[i]);  // ์ฆ๊ฐ€ ์ˆ˜์—ด ๊ณ„์† ์ด์–ด๊ฐ€๊ธฐ
} else {
    // number[i]๊ฐ€ ๋“ค์–ด๊ฐˆ ์œ„์น˜๋ฅผ ์ฐพ์•„์„œ ๊ต์ฒด (์ˆ˜์—ด ์œ ์ง€)
    for (int j = 0; j < list.size(); j++) {
        if (number[i] <= list.get(j)) {
            list.set(j, number[i]);
            break;
        }
    }
}
  • ์™ผ์ชฝ ์ „๋ด‡๋Œ€ ์œ„์น˜ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์˜ค๋ฅธ์ชฝ ๊ฐ’์— ๋Œ€ํ•ด์„œ๋งŒ ๋น„๊ตํ•˜๋ฉด ๋œ๋‹ค.

โœ… ๋ฌธ์ œ์—์„œ ์ž…๋ ฅ ๊ฐ’์ด ์ปค์ง„๋‹ค๋ฉด?

ํ˜„์žฌ ๋ฌธ์ œ์—์„œ์˜ ์ž…๋ ฅ๊ฐ’ ํฌ๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ฒซ์งธ ์ค„์—๋Š” ๋‘ ์ „๋ด‡๋Œ€ ์‚ฌ์ด์˜ ์ „๊นƒ์ค„์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ „๊นƒ์ค„์˜ ๊ฐœ์ˆ˜๋Š” 100 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋‹ค.

ํ˜„์žฌ ๋ฌธ์ œ์—์„œ๋Š” ์ „๊นƒ์ค„์˜ ๊ฐœ์ˆ˜๊ฐ€ 100 ์ดํ•˜๋กœ ์ฃผ์–ด์ง€๋ฏ€๋กœ 2์ค‘ for๋ฌธ์„ ์‚ฌ์šฉํ•ด๋„ ์—ฐ์‚ฐ ์ˆ˜๊ฐ€ 10,000๋ฒˆ ์ •๋„์ด์ง€๋งŒ, ๊ฐœ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚œ๋‹ค๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” **์ด์ง„ ํƒ์ƒ‰ (Binary Search)**๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๋Œ€ํญ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ–ฅ๏ธ ํ’€์ด ์ฝ”๋“œ (Java)

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));
        //StringTokenizer st = new StringTokenizer(br.readLine());
        int input = Integer.parseInt(br.readLine());
        int[][] inputNum = new int[input][2];
        int[] number = new int[input];
        for(int i=0;i<input;i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            inputNum[i][0] = Integer.parseInt(st.nextToken());
            inputNum[i][1] = Integer.parseInt(st.nextToken());
        }
        Arrays.sort(inputNum, (a, b)->{
            if(a[0]<b[0]) return -1;
            else if(a[0]>b[0]) return 1;
            else return 0;
        });
        for(int i=0;i<input;i++) number[i] = inputNum[i][1];
        List<Integer> list = new ArrayList<>();
        list.add(number[0]);
        for(int i=1;i<input;i++){
            if(number[i] > list.get(list.size()-1)){
                list.add(number[i]);
            }
            else{
                for(int j=0;j<list.size();j++){
                    if(number[i] <= list.get(j)){
                        list.set(j, number[i]);
                        break;
                    }
                }
            }
        }
        System.out.println(input - list.size());
    }
}

โฐ ์‹œ๊ฐ„๋ณต์žก๋„

  • ์ด์ค‘ for๋ฌธ โ†’ O(Nยฒ) (์ตœ๋Œ€ 100๊ฐœ ์ž…๋ ฅ์ด๋ฏ€๋กœ ๊ฐ€๋Šฅ)
  • ์ด๋ถ„ํƒ์ƒ‰ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ O(N log N)
์ „์ฒด ๊ธ€ ๋ณด๊ธฐ