Home > CS > 2024 > πŸ’Ύ [CS] μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹œκ°„ λ³΅μž‘λ„(Time Complexity)λž€ λ¬΄μ—‡μΌκΉŒμš”?

πŸ’Ύ [CS] μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹œκ°„ λ³΅μž‘λ„(Time Complexity)λž€ λ¬΄μ—‡μΌκΉŒμš”?
CS

πŸ’Ύ [CS] μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹œκ°„ λ³΅μž‘λ„(Time Complexity)λž€ λ¬΄μ—‡μΌκΉŒμš”?

  • μ‹œκ°„ λ³΅μž‘λ„(Time Complexity)λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄ μž…λ ₯ 크기에 따라 μ‹€ν–‰ν•˜λŠ” μ—°μ‚°μ˜ 수λ₯Ό μΈ‘μ •ν•˜λŠ” μ§€ν‘œλ‘œ, μ•Œκ³ λ¦¬μ¦˜μ˜ νš¨μœ¨μ„±μ„ ν‰κ°€ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.
  • μ‹œκ°„ λ³΅μž‘λ„(Time Complexity)λŠ” 주둜 μž…λ ₯ 크기(n)κ°€ 컀질수둝 μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹€ν–‰μ‹œκ°„μ΄ μ–Όλ§ˆλ‚˜ 빨리 μ¦κ°€ν•˜λŠ” 지λ₯Ό λ‚˜νƒ€λ‚΄λ©°, λΉ…-였 ν‘œκΈ°λ²•(Big-O Notaion)으둜 ν‘œν˜„λ©λ‹ˆλ‹€.

1️⃣ μ™œ μ‹œκ°„ λ³΅μž‘λ„(Time Complexity)κ°€ μ€‘μš”ν•œκ°€μš”?

1️⃣ 효율적인 μ•Œκ³ λ¦¬μ¦˜ 섀계.

  • μ•Œκ³ λ¦¬μ¦˜μ˜ νš¨μœ¨μ„±μ„ 평가할 λ•Œ, μž…λ ₯ λ°μ΄ν„°μ˜ 크기가 컀질수둝 μ–Όλ§ˆλ‚˜ λΉ λ₯΄κ²Œ μ‹€ν–‰ λ˜λŠ”μ§€λ₯Ό κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€.
    • μ‹œκ°„ λ³΅μž‘λ„(Time Complexity)λ₯Ό 톡해 μ•Œκ³ λ¦¬μ¦˜(Algorithm)의 μ„±λŠ₯을 λΉ„κ΅ν•˜κ³ , 더 λ‚˜μ€ μ•Œκ³ λ¦¬μ¦˜(Algorithm)을 선택할 수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ λŒ€κ·œλͺ¨ 데이터 처리.

  • μ‹€μ œ ν”„λ‘œκ·Έλž¨μ€ λŒ€κ·œλͺ¨ 데이터λ₯Ό μ²˜λ¦¬ν•΄μ•Ό ν•  λ•Œκ°€ λ§ŽμŠ΅λ‹ˆλ‹€.
    • μ‹œκ°„ λ³΅μž‘λ„(Time Complexity)κ°€ 높은 μ•Œκ³ λ¦¬μ¦˜(Algorithm)은 큰 μž…λ ₯을 μ²˜λ¦¬ν•  λ•Œ μ‹€ν–‰ μ‹œκ°„μ΄ 크게 μ¦κ°€ν•˜μ—¬ μ„±λŠ₯이 μ €ν•˜λ  수 μžˆμŠ΅λ‹ˆλ‹€.

3️⃣ μ„±λŠ₯ 예츑.

  • μ‹œκ°„ λ³΅μž‘λ„(Time Complexity)λ₯Ό μ•Œλ©΄ μž…λ ₯ 크기 변화에 λ”°λ₯Έ μ•Œκ³ λ¦¬μ¦˜μ˜ μ„±λŠ₯을 μ˜ˆμΈ‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • 이λ₯Ό 톡해 μ΅œμ ν™”ν•  뢀뢄을 μ‹λ³„ν•˜κ³ , 더 효율적인 μ½”λ“œλ‘œ κ°œμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ μ‹œκ°„ λ³΅μž‘λ„(Time Complexity)의 κΈ°λ³Έ κ°œλ….

  • μ‹œκ°„ λ³΅μž‘λ„(Time Complexity)λŠ” μž…λ ₯ 크기(n)에 따라 μ•Œκ³ λ¦¬μ¦˜μ΄ μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ” κΈ°λ³Έ μ—°μ‚°μ˜ 수λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • 일반적으둜 μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹€ν–‰ μ‹œκ°„μ„ μ ˆλŒ€μ μΈ 초 λ‹¨μœ„λ‘œ μΈ‘μ •ν•˜μ§€ μ•Šκ³ , μ—°μ‚° 횟수둜 μΆ”μƒν™”ν•˜μ—¬ ν‘œν˜„ν•©λ‹ˆλ‹€.
    • μ΄λŠ” ν•˜λ“œμ›¨μ–΄ μ„±λŠ₯에 따라 μ‹€μ œ μ‹œκ°„μ€ λ‹€λ₯Ό 수 μžˆμ§€λ§Œ, μ—°μ‚° νšŸμˆ˜λŠ” λ™μΌν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.
  • μ‹œκ°„ λ³΅μž‘λ„(Time Complexity)λŠ” μ΅œμ•…μ˜ 경우λ₯Ό κΈ°μ€€μœΌλ‘œ ν•˜λŠ” 것이 일반적이며, μ΄λŠ” μ•Œκ³ λ¦¬μ¦˜(Algorithm)의 μ„±λŠ₯을 보μž₯ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€.

3️⃣ λΉ…-였 ν‘œκΈ°λ²•(Big-O Notation)

  • λΉ…-였 ν‘œκΈ°λ²•(Big-O Notation)은 μ‹œκ°„ λ³΅μž‘λ„(Time Complexity)λ₯Ό ν‘œν˜„ν•˜λŠ” λ°©μ‹μœΌλ‘œ, μž…λ ₯ 크기(n)κ°€ 증가할 λ•Œ μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹€ν–‰ μ‹œκ°„μ΄ μ–Όλ§ˆλ‚˜ λΉ λ₯΄κ²Œ μ¦κ°€ν•˜λŠ”μ§€λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

1️⃣ μ£Όμš” λΉ…-였 ν‘œκΈ°λ²•.

1️⃣ O(1) πŸ‘‰ μƒμˆ˜ μ‹œκ°„(Constant Time)

  • μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹€ν–‰ 사간이 μž…λ ₯ 크기와 μƒκ΄€μ—…μ‹œ μΌμ •ν•©λ‹ˆλ‹€.
  • 예: λ°°μ—΄μ˜ νŠΉμ • μΈλ±μŠ€μ— μ ‘κ·Όν•˜κΈ°(예: arr[0])

2️⃣ O(lon g) πŸ‘‰ 둜그 μ‹œκ°„(Longarithmic Time)

  • μž…λ ₯ 크기가 컀질 수둝 μ‹€ν–‰ μ‹œκ°„μ΄ μ™„λ§Œν•˜κ²Œ μ¦κ°€ν•©λ‹ˆλ‹€.
  • 예: 이진 탐색(Binary Search)

3️⃣ O(n) πŸ‘‰ μ„ ν˜• μ‹œκ°„(Linear Time)

  • μž…λ ₯ 크기에 λΉ„λ‘€ν•˜μ—¬ μ‹€ν–‰ μ‹œκ°„μ΄ μ¦κ°€ν•©λ‹ˆλ‹€.
  • 예: λ°°μ—΄μ—μ„œ νŠΉμ • 값을 μ°ΎκΈ° μœ„ν•΄ λͺ¨λ“  μš”μ†Œλ₯Ό κ²€μ‚¬ν•˜λŠ” 경우.

4️⃣ O(n log n) πŸ‘‰ μ„ ν˜• 둜그 μ‹œκ°„(Linearithmic Time)

  • μ„ ν˜• μ‹œκ°„λ³΄λ‹€ 더 λ³΅μž‘ν•œ μ‹œκ°„ λ³΅μž‘λ„.
    • 일반적으둜 효율적인 μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ—μ„œ λ°œμƒν•©λ‹ˆλ‹€.
  • 예: 퀡 μ •λ ¬(Quick Sort), 병합 μ •λ ¬(Merge Sort)

5️⃣ O(n^2) πŸ‘‰ 이차 μ‹œκ°„(Quadratic Time)

  • μž…λ ₯ 크기에 λŒ€ν•΄ μ œκ³±μ— λΉ„λ‘€ν•˜μ—¬ μ‹€ν–‰ μ‹œκ°„μ΄ μ¦κ°€ν•©λ‹ˆλ‹€.
    • 일반적으둜 μ€‘μ²©λœ λ°˜λ³΅λ¬Έμ—μ„œ λ°œμƒν•©λ‹ˆλ‹€.
  • 예: 버블 μ •λ ¬(Bubble Sort), μ‚½μž… μ •λ ¬(Insertion Sort)

6️⃣ O(2^n) πŸ‘‰ μ§€μˆ˜ μ‹œκ°„(Exponential Time)

  • μž…λ ₯ 크기가 컀질수둝 μ‹€ν–‰ μ‹œκ°„μ΄ μ§€μˆ˜μ μœΌλ‘œ μ¦κ°€ν•©λ‹ˆλ‹€.
    • 보톡 μž…λ ₯ 크기가 μž‘μ„ λ•Œλ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 예: ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄μ„ μž¬κ·€μ μœΌλ‘œ κ³„μ‚°ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜

7️⃣ O(n!) πŸ‘‰ νŒ©ν† λ¦¬μ–Ό μ‹œκ°„(Factorial Time)

  • μž…λ ₯ 크기가 컀질수둝 μ‹€ν–‰ μ‹œκ°„μ΄ 맀우 λΉ λ₯΄κ²Œ μ¦κ°€ν•©λ‹ˆλ‹€.
    • 주둜 λͺ¨λ“  κ°€λŠ₯ν•œ μˆœμ—΄μ„ κ³„μ‚°ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ—μ„œ λ°œμƒν•©λ‹ˆλ‹€.
  • 예: μˆœμ—΄(permutation) 생성.

4️⃣ μ‹œκ°„ λ³΅μž‘λ„μ˜ μ˜ˆμ‹œ.

1️⃣ O(1) πŸ‘‰ μƒμˆ˜ μ‹œκ°„.

int getFirstElement(int[] arr) {
    return arr[0]; // μž…λ ₯ 크기와 상관없이 μΌμ •ν•œ μ‹œκ°„
}

2️⃣ O(n) πŸ‘‰ μ„ ν˜• μ‹œκ°„.

int sum(int[] arr) {
    int sum = 0;
    for (int num : arr) {
        sum += num; // λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό 순회
    }
    return sum;
}

3️⃣ O(n^2) πŸ‘‰ 이차 μ‹œκ°„.

void printPairs(int[] arr) {
    for(int i = 0; i < arr.length; i++) {
        for(int j = 0; j < arr.length; j++) {
            System.out.println(arr[i] + ", " + arr[j]); // μ€‘μ²©λœ 반볡문
        }
    }
}

5️⃣ μ‹œκ°„ λ³΅μž‘λ„ 뢄석 방법.

1️⃣ 반볡문.

  • 반볡문이 ν•œ 번 싀행될 λ•Œλ§ˆλ‹€ O(n).
    • μ€‘μ²©λœ 반볡문 O(n^2), O(n^3)와 같은 더 높은 차수의 μ‹œκ°„ λ³΅μž‘λ„λ₯Ό κ°€μ§‘λ‹ˆλ‹€.

2️⃣ 쑰건문.

  • if-else 쑰건문은 μž…λ ₯ 크기에 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠλŠ” 경우 O(1)

3️⃣ μž¬κ·€ 호좜.

  • μž¬κ·€ ν•¨μˆ˜μ˜ μ‹œκ°„ λ³΅μž‘λ„λŠ” μž¬κ·€ 호좜의 κΉŠμ΄μ™€ 각 호좜의 μž‘μ—…μ— 따라 λ‹¬λΌμ§‘λ‹ˆλ‹€.
    • ν”Όλ³΄λ‚˜μΉ˜ μž¬κ·€ ν•¨μˆ˜λŠ” O(2^n) μ‹œκ°„ λ³΅μž‘λ„λ₯Ό κ°€μ§‘λ‹ˆλ‹€.

4️⃣ μ—°μ‚°.

  • 일반적인 μ‚°μˆ  μ—°μ‚°, 비ꡐ, ν• λ‹Ή 등은 O(1)

6️⃣ μ‹œκ°„ λ³΅μž‘λ„ 예츑의 μ€‘μš”μ„±.

  • μ‹œκ°„ λ³΅μž‘λ„λ₯Ό 잘 μ΄ν•΄ν•˜λ©΄, μ•Œκ³ λ¦¬μ¦˜μ„ 섀계할 λ•Œ νš¨μœ¨μ„±μ„ μ˜ˆμΈ‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ½”λ”©ν…ŒμŠ€νŠΈλ‚˜ μ‹€μ œ κ°œλ°œμ—μ„œλ„ μ„±λŠ₯ μ΅œμ ν™”κ°€ μ€‘μš”ν•œλ°, μ‹œκ°„ λ³΅μž‘λ„(Time Complexity)λ₯Ό 톡해 μž…λ ₯ 크기에 따라 μ•Œκ³ λ¦¬μ¦˜μ΄ μ–΄λ–»κ²Œ λ™μž‘ν• μ§€ 미리 μ˜ˆμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

7️⃣ μš”μ•½.

  • μ‹œκ°„ λ³΅μž‘λ„(Time Complexity)λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄ μž…λ ₯ 크기에 따라 μ–Όλ§ˆλ‚˜ λΉ λ₯΄κ²Œ μ‹€ν–‰ μ‹œκ°„μ΄ μ¦κ°€ν•˜λŠ”μ§€λ₯Ό ν‰κ°€ν•˜λŠ” μ§€ν‘œλ‘œ, μ•Œκ³ λ¦¬μ¦˜μ˜ νš¨μœ¨μ„±μ„ λΉ„κ΅ν•˜κ³  μ„±λŠ₯을 μ΅œμ ν™”ν•˜λŠ” 데 μ€‘μš”ν•œ 역할을 ν•©λ‹ˆλ‹€.
  • λΉ…-였 ν‘œκΈ°λ²•(Big-O Notation)은 μ‹œκ°„ λ³΅μž‘λ„(Time Complexity)λ₯Ό ν‘œν˜„ν•˜λŠ” λ°©μ‹μœΌλ‘œ, μ•Œκ³ λ¦¬μ¦˜μ˜ μ„±λŠ₯을 좔상적이고 κ°„κ²°ν•˜κ²Œ λ‚˜νƒ€λ‚΄μ˜€, μž…λ ₯ 크기 변화에 λ”°λ₯Έ μ•Œκ³ λ¦¬μ¦˜μ˜ λ™μž‘μ„ μ˜ˆμΈ‘ν•  수 있게 λ„μ™€μ€λ‹ˆλ‹€.
  • 효율적인 μ•Œκ³ λ¦¬μ¦˜μ„ μ„€κ³„ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ‹œκ°„ λ³΅μž‘λ„μ— λŒ€ν•œ κΉŠμ€ 이해가 ν•„μˆ˜μ μž…λ‹ˆλ‹€.