[자료ꡬ쑰][μ•Œκ³ λ¦¬μ¦˜] Big O ν‘œκΈ°λ²•

2025. 2. 13. 18:59Β·βš™οΈ CS/πŸ“š 자료ꡬ쑰 & μ•Œκ³ λ¦¬μ¦˜

 

 

πŸ”Ž 주제

이번 ν¬μŠ€νŒ…μ—μ„œλŠ” μžλ£Œκ΅¬μ‘°μ™€ μ•Œκ³ λ¦¬μ¦˜μ—μ„œ μ•Œκ³ λ¦¬μ¦˜μ˜ μ„±λŠ₯을 λ”°μ§ˆ λ•Œ μ€‘μš”ν•œ ν‘œκΈ°λ²•μΈ Big O ν‘œκΈ°λ²•μ˜ κ°œλ…μ„ μ‚΄νŽ΄λ³΄κ³ , λͺ‡ κ°€μ§€ μ˜ˆμ‹œλ₯Ό λ“€μ–΄λ³΄κ³ μž ν•œλ‹€.

Big O ν‘œκΈ°λ²•

μ•Œκ³ λ¦¬μ¦˜μ˜ λ³΅μž‘λ„λ₯Ό λ‚˜νƒ€λ‚Ό λ•Œ Big Θ, Big Ω ν‘œκΈ°λ²• λ“± μ—¬λŸ¬ 방법이 μžˆμ§€λ§Œ

κ°€μž₯ 많이 μ“°λŠ” 건 Big O ν‘œκΈ°λ²•μΈ λ“― ν•˜λ‹€.

μ •μ˜

μ•Œκ³ λ¦¬μ§μ˜ μ„±λŠ₯을 λ‚˜νƒ€λ‚΄λŠ” λ²•μœΌλ‘œ μ•Œκ³ λ¦¬μ¦˜μ΄ μ–Όλ§ˆλ‚˜ λΉ λ₯΄κ³  νš¨μœ¨μ μΈμ§€λ₯Ό 수둜 ν‘œν˜„ν•œλ‹€.

μ•Œκ³ λ¦¬μ¦˜μ—μ„œ νš¨μœ¨μ„ 계산할 λ•Œ μ€‘μš”ν•œ 건 'λ°μ΄ν„°μ˜ μˆ˜κ°€ λ§Žμ•„μ§ˆ λ•Œ μ—°μ‚° νšŸμˆ˜λŠ” μ–Όλ§ˆλ‚˜ μ¦κ°€ν•˜λŠ”κ°€?'이고 Big OλŠ” μ•Œκ³ λ¦¬μ¦˜μ΄ μ„±λŠ₯이 μ΅œμ•…μΈ 경우λ₯Ό λ‚˜νƒ€λ‚  λ•Œ μ‚¬μš©ν•œλ‹€.

λ”°λΌμ„œ ν•΄λ‹Ή μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜λŠ” μ–΄λ–€ κ²½μš°μ—λ„ 보μž₯λ˜λŠ” μ„±λŠ₯ ν‘œκΈ°λ²•μ΄λ‹€.

μ•Œκ³ λ¦¬μ¦˜μ˜ μ„±λŠ₯?

μ•Œκ³ λ¦¬μ¦˜μ˜ μ„±λŠ₯은 1. μ½”λ“œμ˜ μ‹€ν–‰ 속도(μ‹œκ°„)κ³Ό 2. μ½”λ“œ μ‹€ν–‰ μ‹œ ν•„μš”ν•œ λ©”λͺ¨λ¦¬μ˜ μ–‘μœΌλ‘œ ν‰κ°€λœλ‹€.

Big O ν‘œκΈ°λ²•μœΌλ‘œλŠ” μ‹œκ°„ λ³΅μž‘λ„μ™€ 곡간 λ³΅μž‘λ„λ₯Ό 뢄석할 수 μžˆλ‹€.

  • μ‹œκ°„ λ³΅μž‘λ„: μ½”λ“œκ°€ μ‹€ν–‰λ˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„
    • μž…λ ₯ 데이터 개수(n)κ°€ λŠ˜μ–΄λ‚ μˆ˜λ‘ 컴퓨터가 κ·Έ μž‘μ—…μ„ μ²˜λ¦¬ν•˜λŠ”λ°λŠ” μ–Όλ§ˆλ‚˜ μ‹€ν–‰ μ‹œκ°„μ΄ λŠ˜μ–΄λ‚ κΉŒ?
  • 곡간 λ³΅μž‘λ„: μ½”λ“œκ°€ μ‹€ν–‰λ˜λ©΄μ„œ μ‚¬μš©λ˜λŠ” λ©”λͺ¨λ¦¬ μ–‘
    • μž…λ ₯ 데이터 개수(n)κ°€ λŠ˜μ–΄λ‚ μˆ˜λ‘ μ–Όλ§ˆλ‚˜ λ§Žμ€ μ–‘μ˜ 데이터가 λ©”λͺ¨λ¦¬μ— μ €μž₯λ˜μ–΄μ•Ό ν• κΉŒ?

μˆ˜ν•™μ  μ •μ˜

μˆ˜ν•™μ μœΌλ‘œ λ‚˜νƒ€λ‚Έ μ •μ˜λŠ” λ‹€μŒκ³Ό κ°™λ‹€. 개인적으둜 이 μ •μ˜κ°€ λ§˜μ— λ“ λ‹€.

f(n) = O(g(n)) iff there exist positive costants c and n0 such that f(n)≤ c·g(n) for all n, n≥nβ‚€

λͺ¨λ“  n, n≥nβ‚€ 에 λŒ€ν•˜μ—¬ f(n)≤ c·g(n) λ₯Ό λ§Œμ‘±ν•˜λŠ” μ–‘μ˜ μƒμˆ˜ c 와 n0 κ°€ μ‘΄μž¬ν•˜λ©΄ f(n) = O(g(n)) 이닀.
μ΄λ•Œ f(n) 은 _g(n)_의 Big O라고 μ½λŠ”λ‹€.

예λ₯Ό λ“€μ–΄ _f(n)_κ³Ό _g(n)_이 λ‹€μŒκ³Ό κ°™λ‹€κ³  ν•˜μž. ν‰κ°€ν•˜λ €λŠ” (μ‹œκ°„λ³΅μž‘λ„ or κ³΅κ°„λ³΅μž‘λ„) ν•¨μˆ˜κ°€ _f(n)_이고, _g(n)_은 비ꡐ할 ν•¨μˆ˜μ΄λ‹€.

f(n) = 3n+2
g(n) = n

μ΄λ•Œ 3nβ‚€+2≤ cn₀을 λ§Œμ‘±ν•˜λŠ” c=4, nβ‚€=2이닀. 쑰건을 λ§Œμ‘±ν•˜λŠ” c와 n₀이 μžˆμœΌλ―€λ‘œ f(n) = 3n=2 = _O(n)_이닀.

μ—¬κΈ°μ„œ λ‘λ“œλŸ¬μ§€λŠ” Big O ν‘œκΈ°λ²•μ˜ νŠΉμ§•μ€

  1. μƒμˆ˜ν•­μ„ λ¬΄μ‹œν•œλ‹€.
    _O(2n)_이든 _O(3n+1)_이든 _O(n)_이닀.
  2. μ΅œκ³ μ°¨ν•­λ§Œ λ³Έλ‹€.
    데이터 μž…λ ₯ 개수 n의 영ν–₯을 λ°›μœΌλ―€λ‘œ κ°€μž₯ 영ν–₯λ ₯이 큰 μ΅œκ³ μ°¨ν•­λ§Œ λ³Έλ‹€.
    _O(3n²+2n+1)_은 _O(3n²)_으둜, μ—¬κΈ°μ„œ _O(n²)_으둜 보면 λœλ‹€.

μ•„λž˜ κ·Έλž˜ν”„λŠ” Big O ν‘œκΈ°λ²•μ—μ„œ 주둜 μ‚¬μš©λ˜λŠ” ν‘œκΈ°λ“€μ˜ μž…λ ₯ κ°œμˆ˜μ— λ”°λ₯Έ μ„±λŠ₯ 차이λ₯Ό λ‚˜νƒ€λ‚Έ 것이닀.

Big Oμ—μ„œ μ‹œκ°„ λ³΅μž‘λ„λ₯Ό λ”°μ§€λ©΄ λ‹€μŒκ³Ό κ°™λ‹€. g(n)이 μƒμˆ˜μ— κ°€κΉŒμšΈμˆ˜λ‘ 효율이 μ’‹λ‹€.

O(1) < O(log n) < O(n) < O(nlogn) < O(n²) < ...
μ‹œκ°„ λ³΅μž‘λ„ πŸ”½ ---------------μ‹œκ°„ λ³΅μž‘λ„ ⏫

μ•Œκ³ λ¦¬μ¦˜ μ„±λŠ₯이 λΉ¨κ°„μƒ‰μœΌλ‘œ λ„˜μ–΄κ°„λ‹€λ©΄ μˆ˜μ •μ΄ ν•„μš”ν•  것이닀.

μ˜ˆμ‹œμ™€ μ‹€μŠ΅

μ•Œκ³ λ¦¬μ¦˜ κ°•μ˜μ—μ„œ 주둜 μ •λ ¬κ³Ό 탐색 μ•Œκ³ λ¦¬μ¦˜μ„ μ˜ˆμ‹œλ‘œ λ°°μ›Œ

그와 κ΄€λ ¨λœ μ‹€μƒν™œ 사둀λ₯Ό κ°€μ§€κ³  μ™”λ‹€.

O(n)

O(n)=f(n)=n으둜 O(n)은 ν•˜λ‚˜μ”© ν™•μΈν•˜λŠ” μ„ ν˜• μ•Œκ³ λ¦¬μ¦˜μ— ν•΄λ‹Ήν•œλ‹€.

μ΅œμ•…μ˜ 경우 μž…λ ₯ 데이터 n개λ₯Ό λͺ¨λ‘ ν™•μΈν•œλ‹€.

μ‹€μƒν™œ μ˜ˆμ‹œ

λ„μ„œκ΄€μ—μ„œ 곡뢀에 ν•„μš”ν•œ 책을 빌리렀고 ν•˜λŠ”λ°, λ„μ„œκ΄€μ˜ 책듀이 아직 μ •λ¦¬λ˜μ§€ μ•Šμ€ μƒνƒœμ΄λ‹€.

ν•œ κΆŒμ”© κΊΌλ‚΄ 제λͺ©μ„ ν™•μΈν•˜λ©° 책을 μ°ΎλŠ”λ‹€.

운이 μ—†λ‹€λ©΄, λ„μ„œκ΄€μ˜ λͺ¨λ“  μ±… n개λ₯Ό 확인해야 ν•œλ‹€.

이런 μ‹μ˜ 탐색을 μ„ ν˜• 탐색이라고 ν•œλ‹€.

μ½”λ“œ

public class LinearSearch {
    public static int linearSearch(String[] arr, String target) {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i].equals(target)) return i;  // 찾으면 인덱슀 λ°˜ν™˜
        }
        return -1;  // μ°Ύμ§€ λͺ»ν•œ 경우
    }

    public static void main(String[] args) {
        String[] arr = {"μ½”λ”©μ˜ 이해", "κ°œλ°œμžκ°€ 되고 μ‹Άμ–΄?", "μŠ€ν”„λ¦°νŠΈ",
                        "μ•Œκ³ λ¦¬μ¦˜ νŒŒν—€μΉ˜κΈ°","자료ꡬ쑰의 정석"};
        System.out.println(linearSearch(arr, "μŠ€ν”„λ¦°νŠΈ"));  // 2
    }
}

O(log n)

μ‹€μƒν™œ μ˜ˆμ‹œ

μ‚¬μ „μ—μ„œ μ–΄λ–€ 단어λ₯Ό 찾으렀고 ν•œλ‹€.

사전은 λ‹Ήμ—°νžˆ γ„±γ„΄γ„·, ν˜Ήμ€ ABC μˆœμ„œλ‘œ μ •λ ¬λœ μƒνƒœλΌκ³  κ°€μ •ν•œλ‹€.

μ²˜μŒλΆ€ν„° μ°ΎλŠ” 게 μ•„λ‹ˆλΌ μ€‘λ°˜λΆ€ν„° μ°Ύμ•„κ°€λ©° 확인해야 ν•˜λŠ” νŽ˜μ΄μ§€λ₯Ό μ ˆλ°˜μ”© 쀄인닀.

μ–˜λ₯Ό λ“€μ–΄ "Notation" 뜻이 κΆκΈˆν•˜λ‹€λ©΄,

일단 μ‚¬μ „μ—μ„œ 쀑간 νŽ˜μ΄μ§€μ˜ 단어와 Notation의 μ•ŒνŒŒλ²³μ„ λΉ„κ΅ν•œλ‹€.

n이 λ’·μͺ½μ— μžˆλ‹€λ©΄ 이제 쀑간 νŽ˜μ΄μ§€μ˜ λ’·λΆ€λΆ„λ“€λ§Œ ν™•μΈν•˜λ©΄ λœλ‹€.

이런 μ‹μœΌλ‘œ μ ˆλ°˜μ”© μ€„μ—¬λ‚˜κ°„λ‹€. μ΄λŸ¬ν•œ 탐색을 이진 탐색이라고 ν•œλ‹€.

μ½”λ“œ

import java.util.Arrays;

public class DictionarySearch {
    public static int binarySearchDictionary(String[] dictionary, String target) {
        int left = 0, right = dictionary.length - 1;

        while (left <= right) {
            int mid = left + (right - left) / 2;
            int comparison = dictionary[mid].compareTo(target);

            if (comparison == 0) return mid;  // 단어λ₯Ό μ°Ύμ•˜μ„ 경우 인덱슀 λ°˜ν™˜
            else if (comparison < 0) left = mid + 1;  // target이 사전 순으둜 λ’€μͺ½μ΄λ©΄ 였λ₯Έμͺ½ 탐색
            else right = mid - 1;  // target이 사전 순으둜 μ•žμͺ½μ΄λ©΄ μ™Όμͺ½ 탐색
        }
        return -1;  // 단어가 사전에 μ—†λŠ” 경우
    }

    public static void main(String[] args) {
        String[] dictionary = {"algorithm", "data", "character", "map", "notation", "object", "public", "static"};
        Arrays.sort(dictionary);  // 사전은 μ •λ ¬λ˜μ–΄ μžˆμ–΄μ•Ό 함
        String target = "notation";

        int result = binarySearchDictionary(dictionary, target);
        if (result != -1) {
            System.out.println("단어 '" + target + "'λŠ” μ‚¬μ „μ˜ " + result + "번째 μΈλ±μŠ€μ— μžˆμŠ΅λ‹ˆλ‹€.");
        } else {
            System.out.println("단어 '" + target + "'λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.");
        }
    }
}

+
μ™œ μ ˆλ°˜μ”© μ€„μ—¬κ°€λŠ” 것이 O(log n)일까?

1️⃣ ν•œ 단계 μ§„ν–‰ν•  λ•Œλ§ˆλ‹€ 검색할 νŽ˜μ΄μ§€ μˆ˜κ°€ 절반으둜 쀄어든닀.

μ‚¬μ „μ˜ 총 νŽ˜μ΄μ§€ 수λ₯Ό n이라고 ν•˜λ©΄,

  • 첫 번째 비ꡐ ν›„ n/2 개의 νŽ˜μ΄μ§€λ§Œ ν™•μΈν•˜λ©΄ 됨
  • 두 번째 비ꡐ ν›„ n/4 개의 νŽ˜μ΄μ§€λ§Œ ν™•μΈν•˜λ©΄ 됨
  • μ„Έ 번째 비ꡐ ν›„ n/8 개의 νŽ˜μ΄μ§€λ§Œ ν™•μΈν•˜λ©΄ 됨
  • k번째 비ꡐ ν›„ n / 2ᡏ 개의 νŽ˜μ΄μ§€λ§Œ ν™•μΈν•˜λ©΄ 됨

2️⃣ μ–Έμ œ 검색이 λλ‚˜λŠ”μ§€ 계산

이진 탐색은 보톡 1개의 νŽ˜μ΄μ§€λ§Œ λ‚¨μ•˜μ„ λ•Œ μ’…λ£Œν•œλ‹€.

n / 2ᡏ = 1이 λ˜λŠ” kλ₯Ό κ΅¬ν•˜κΈ° μœ„ν•΄ 양변에 logλ₯Ό μ μš©ν•˜λ©΄

logβ‚‚n= k

즉, 이진 νƒμƒ‰μ˜ μ΅œλŒ€ 비ꡐ 횟수 kλŠ” logβ‚‚(n) 이고

Big O ν‘œκΈ°λ²•μ— 따라 O(log n)이닀.

O(nβˆ™log n)

  • 병합 μ •λ ¬, 퀡 μ •λ ¬, νž™ μ •λ ¬ 등이 μ†ν•œλ‹€.

κ·Έ 쀑 병합 정렬은 배열을 계속 반으둜 λ‚˜λˆˆ ν›„, μ •λ ¬λœ μƒνƒœλ‘œ λ‹€μ‹œ ν•©μΉ˜λŠ” 'λΆ„ν•  정볡' μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•œλ‹€.

μ‹€μƒν™œ μ˜ˆμ‹œ

λŒ€ν•™ μž…μ‹œμ—μ„œ 수 μ²œμ—μ„œ 수 만의 μ§€μ›μžμ˜ 성적을 μ •λ ¬ν•΄μ•Ό ν•˜λŠ” 경우

μ–΄λ–»κ²Œ μ •λ ¬ν•  것인가?

μ½”λ“œ

import java.util.Arrays;

public class MergeSort {
    public static void mergeSort(int[] arr) {
        if (arr.length < 2) return; // 배열이 ν•˜λ‚˜ μ΄ν•˜μ˜ μ›μ†Œλ§Œ 있으면 μ •λ ¬ν•  ν•„μš” μ—†μŒ

        int mid = arr.length / 2;  // 쀑간 지점
        int[] left = Arrays.copyOfRange(arr, 0, mid);   // μ™Όμͺ½ λΆ€λΆ„ λ°°μ—΄
        int[] right = Arrays.copyOfRange(arr, mid, arr.length);  // 였λ₯Έμͺ½ λΆ€λΆ„ λ°°μ—΄

        mergeSort(left);  // μ™Όμͺ½ λ°°μ—΄ μ •λ ¬
        mergeSort(right); // 였λ₯Έμͺ½ λ°°μ—΄ μ •λ ¬
        merge(arr, left, right);  // μ •λ ¬λœ 배열을 ν•©μΉ˜κΈ°
    }

    private static void merge(int[] arr, int[] left, int[] right) {
        int i = 0, j = 0, k = 0;
        while (i < left.length && j < right.length) {
            if (left[i] <= right[j]) arr[k++] = left[i++]; // μž‘μ€ 값을 배열에 λ„£κΈ°
            else arr[k++] = right[j++];
        }
        while (i < left.length) arr[k++] = left[i++];  // 남은 μš”μ†Œ μΆ”κ°€
        while (j < right.length) arr[k++] = right[j++];
    }

    public static void main(String[] args) {
        int[] arr = {10, 3, 8, 4, 7, 1, 2, 5, 9, 6};
        mergeSort(arr);
        System.out.println(Arrays.toString(arr));  // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    }
}

+

μ™œ 병합 정렬은 O(nβˆ™log n)일까?
μ•žμ„œ λ§ν•œ λΆ„ν•  정볡 μ•Œκ³ λ¦¬μ¦˜κ³Ό κ΄€λ ¨ μžˆλ‹€.

μ ˆλ°˜μ”© λ‚˜λˆ„λŠ” 뢄할은 이진 νƒμƒ‰μ—μ„œ ν™•μΈν–ˆλ“―μ΄ O(log n)의 μ‹œκ°„μ΄ ν•„μš”ν•˜κ³ ,

뢄할을 ν•˜λ‚˜μ˜ μ›μ†Œκ°€ 남을 λ•ŒκΉŒμ§€ 반으둜 λ‚˜λˆ„λ―€λ‘œ, n개의 배열이 생기고 이 μ •λ ¬λœ 배열을 n번 합쳐야 ν•œλ‹€. λ”°λΌμ„œ ν•©λ³‘μ—μ„œ O(n)이 μ†Œμš”λœλ‹€.

이 λ‘˜μ„ κ³±ν•΄ 병합 μ •λ ¬μ—μ„œλŠ” O(nβˆ™log n)의 μ‹œκ°„ λ³΅μž‘λ„λ₯Ό κ°€μ§„λ‹€.

πŸ“‹ 참고자료

Thomas H. Cormen et al. "Introduction to Algorithms (3rd Edition)" (MIT Press, 2009)
λΉ…μ˜€ ν‘œκΈ°λ²• (big-O notation) μ΄λž€
[μ•Œκ³ λ¦¬μ¦˜] μ‹œκ°„ λ³΅μž‘λ„μ™€ Big O ν‘œκΈ°λ²•

'βš™οΈ CS > πŸ“š 자료ꡬ쑰 & μ•Œκ³ λ¦¬μ¦˜' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[자료ꡬ쑰] λΉ„μ„ ν˜• 자료 ꡬ쑰 κ°œλ… 정리 | κ·Έλž˜ν”„, 트리, νž™, μš°μ„ μˆœμœ„ 큐, μ…‹, λ§΅, ν•΄μ‹œ ν…Œμ΄λΈ”  (0) 2025.10.18
[자료ꡬ쑰] μ„ ν˜• 자료 ꡬ쑰  (0) 2025.10.02
[μ•Œκ³ λ¦¬μ¦˜] μ‹œκ°„ λ³΅μž‘λ„μ™€ 곡간 λ³΅μž‘λ„ + Big O ν‘œκΈ°λ²•  (0) 2025.10.02
'βš™οΈ CS/πŸ“š 자료ꡬ쑰 & μ•Œκ³ λ¦¬μ¦˜' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [자료ꡬ쑰] λΉ„μ„ ν˜• 자료 ꡬ쑰 κ°œλ… 정리 | κ·Έλž˜ν”„, 트리, νž™, μš°μ„ μˆœμœ„ 큐, μ…‹, λ§΅, ν•΄μ‹œ ν…Œμ΄λΈ”
  • [자료ꡬ쑰] μ„ ν˜• 자료 ꡬ쑰
  • [μ•Œκ³ λ¦¬μ¦˜] μ‹œκ°„ λ³΅μž‘λ„μ™€ 곡간 λ³΅μž‘λ„ + Big O ν‘œκΈ°λ²•
μ†Œμ˜ πŸ€
μ†Œμ˜ πŸ€
Hello World ✨
  • μ†Œμ˜ πŸ€
    Soyoung's Dev Lab
    μ†Œμ˜ πŸ€
  • 전체
    였늘
    μ–΄μ œ
  • κΈ€μ“°κΈ° 관리
    • λΆ„λ₯˜ 전체보기 (79)
      • πŸ“’ κ²Œμ‹œνŒ (0)
      • 🌿Spring (20)
      • β˜•Java (7)
        • μ½”λ”©ν…ŒμŠ€νŠΈ (7)
      • βš™οΈ CS (26)
        • πŸ›œ λ„€νŠΈμ›Œν¬ (5)
        • πŸ“Š λ°μ΄ν„°λ² μ΄μŠ€ (8)
        • πŸ–²οΈμš΄μ˜μ²΄μ œ (9)
        • πŸ“š 자료ꡬ쑰 & μ•Œκ³ λ¦¬μ¦˜ (4)
      • πŸ“€ 배포 (4)
        • Docker (4)
        • AWS (0)
      • πŸ“° 기타 개발 자료 (12)
      • πŸ–₯️ ν”„λ‘œμ νŠΈ (0)
      • πŸ‘©‍πŸ’» ν™œλ™ & ν›„κΈ° (1)
      • 🍡 이야기 (2)
  • λΈ”λ‘œκ·Έ 메뉴

    • νƒœκ·Έ
  • 링크

    • github
    • velog
  • 곡지사항

  • 인기 κΈ€

  • νƒœκ·Έ

    μ½”λ”©ν…ŒμŠ€νŠΈ
    배포
    μ„œλ²„
    μœ„ν΄λ¦¬ 페이퍼
    Java
    docker
    GIT
    λ„€νŠΈμ›Œν¬
    Spring
    λ°μ΄ν„°λ² μ΄μŠ€
    Spring Security
    μ½”λ“œμž‡ μŠ€ν”„λ¦°νŠΈ
    객체지ν–₯ν”„λ‘œκ·Έλž˜λ°
    운영체제
    기술 λ©΄μ ‘
    μ•Œκ³ λ¦¬μ¦˜
    자료ꡬ쑰
    개발
  • 졜근 λŒ“κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.3
μ†Œμ˜ πŸ€
[자료ꡬ쑰][μ•Œκ³ λ¦¬μ¦˜] Big O ν‘œκΈ°λ²•
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”