ν”„λ‘œκ·Έλž˜λ°/Algorithm μ•Œκ³ λ¦¬μ¦˜

[Hello Coding μ•Œκ³ λ¦¬μ¦˜] 1. μ•Œκ³ λ¦¬μ¦˜ μ†Œκ°œ

λΉ„λΉ„ bibi 2021. 2. 3. 22:26

[Hello Coding] μ•Œκ³ λ¦¬μ¦˜ 1μž₯. μ•Œκ³ λ¦¬μ¦˜μ˜ μ†Œκ°œ

μ•Œκ³ λ¦¬μ¦˜μ΄λž€?

: μ–΄λ–€ μΌμ„ν•˜κΈ° μœ„ν•œ λͺ…λ Ήμ˜ μ§‘ν•©.
특히 λ‹€λ₯Έ μ½”λ“œλ³΄λ‹€ 속도λ₯Ό λΉ λ₯΄κ²Œ ν•˜κ±°λ‚˜, 문제λ₯Ό ν’€κΈ° μœ„ν•œ 것.

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

  • μ—¬λŸ¬ μ•Œκ³ λ¦¬μ¦˜λ“€μ˜ μž₯단점과 차이점을 μ•Œμ•„μ•Ό ν•œλ‹€.
  • λ‹¨μˆœνžˆ λ‹€λ₯Έ 자료ꡬ쑰/μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œλ„ μ„±λŠ₯이 크게 달라진닀.

이진 탐색

탐색 문제 Search

: μ£Όμ–΄μ§„ λ°μ΄ν„°μ—μ„œ μ›ν•˜λŠ” ν•­λͺ©μ„ μ–΄λ–€ λ°©λ²•μœΌλ‘œ 찾을 것인가.
예) 1λΆ€ν„° 100κΉŒμ§€μ˜ μˆ«μžλ“€ 쀑 '78'μ΄λΌλŠ” 숫자 μ°ΎκΈ°

λ‹¨μˆœ 탐색 Simple search

: μ²˜μŒλΆ€ν„° ν•˜λ‚˜μ”© μˆœμ„œλŒ€λ‘œ ν•­λͺ©μ„ 탐색
예) 1, 2, 3, 4, ... 77, 78 순으둜 탐색해 78을 μ°ΎλŠ”λ‹€.

  • N개의 μ›μ†Œλ₯Ό κ°€μ§„ λ¦¬μŠ€νŠΈμ—μ„œ μ΅œλŒ€ N번 λ§Œμ— 닡을 찾을 수 μžˆλ‹€.

이진 탐색 Binary search

  • μ •λ ¬λœ μ›μ†Œ λ¦¬μŠ€νŠΈμ—μ„œ,
  • μ›ν•˜λŠ” μ›μ†Œκ°€ 있으면 κ·Έ μ›μ†Œμ˜ 인덱슀λ₯Ό λ°˜ν™˜ / μ—†μœΌλ©΄ null을 λ°˜ν™˜.
  • N개의 μ›μ†Œλ₯Ό κ°€μ§„ λ¦¬μŠ€νŠΈμ—μ„œ μ΅œλŒ€ log2 N번 λ§Œμ— 닡을 찾을 수 μžˆλ‹€.

이진 νƒμƒ‰μ˜ λ™μž‘μ›λ¦¬

: 리슀트의 쀑간 값을 κΈ°μ€€μœΌλ‘œ 쀑간 값보닀 큰지/μž‘μ€μ§€/같은지 νŒλ‹¨ν•΄, λ²”μœ„λ₯Ό μ€„μ—¬κ°€λ©΄μ„œ 반볡 νƒμƒ‰ν•œλ‹€.

μ˜ˆμ‹œ)
1λΆ€ν„° 100κΉŒμ§€μ˜ μˆ«μžλ“€ 쀑 57의 인덱슀 μ°ΎκΈ°

  • 50μ΄λΌλŠ” 쀑간값보닀 큰지 μž‘μ€μ§€ νŒλ‹¨ -> 크닀.
  • 1-50은 λ²”μœ„μ—μ„œ μ œμ™Έν•œ λ‹€μŒ, 51-100 의 쀑간인 75보닀 큰지 μž‘μ€μ§€ νŒλ‹¨ν•œλ‹€. -> μž‘λ‹€.
  • 75-100은 λ²”μœ„μ—μ„œ μ œμ™Έν•œ λ‹€μŒ, 51-74 의 쀑간인 63보닀 큰지 μž‘μ€μ§€ νŒλ‹¨ν•œλ‹€.
  • ... λ₯Ό λ°˜λ³΅ν•΄ 닡을 μ°ΎλŠ”λ‹€.

1-100 쀑 μ–΄λ–€ μˆ«μžλΌλ„ μ΅œλŒ€ 7번 λ§Œμ— 찾을 수 μžˆλ‹€.

μ‹€ν–‰ μ‹œκ°„ running time

μš°λ¦¬λŠ” μ‹œκ°„μ΄λ‚˜ μ €μž₯곡간을 μ ˆμ•½ν•΄ μ£ΌλŠ” κ°€μž₯ 효율적인 μ•Œκ³ λ¦¬μ¦˜μ„ μ°Ύκ³  μ‹Άμ–΄ ν•œλ‹€.

μ„ ν˜• μ‹œκ°„ linear time

: λ‹¨μˆœνƒμƒ‰κ³Ό 같이, N개 μ€‘μ—μ„œ 찾을 λ•Œ μ΅œλŒ€ N번 λ§Œμ— 찾을 수 μžˆλŠ” 경우 μ„ ν˜• μ‹œκ°„μœΌλ‘œ μ‹€ν–‰λœλ‹€κ³  ν•œλ‹€.

둜그 μ‹œκ°„ logarithmic time

: 이진탐색과 같이, N개 μ€‘μ—μ„œ 찾을 λ•Œ μ΅œλŒ€log2 N번 λ§Œμ— 찾을 수 μžˆλŠ” 경우 둜그 μ‹œκ°„μœΌλ‘œ μ‹€ν–‰λœλ‹€κ³  ν•œλ‹€.

λΉ…μ˜€ ν‘œκΈ°λ²• Big O notation

: μ•Œκ³ λ¦¬μ¦˜μ΄ μ–Όλ§ˆλ‚˜ λΉ λ₯Έμ§€ λ‚˜νƒ€λ‚΄λŠ” ν‘œκΈ°λ²•μ΄λ‹€.

  • μ•Œκ³ λ¦¬μ¦˜μ˜ 속도λ₯Ό μ‹œκ°„μ΄ μ•„λ‹Œ μ—°μ‚°νšŸμˆ˜κ°€ μ–΄λ–»κ²Œ μ¦κ°€ν•˜λŠ”μ§€λ‘œ μΈ‘μ •ν•œλ‹€.
    즉 μ•Œκ³ λ¦¬μ¦˜μ΄ λ™μž‘ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ μ΅œλŒ€ μ—°μ‚° 횟수λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.
  • λΉ…μ˜€ ν‘œκΈ°λ²•μ€ μ΅œμ•…μ˜ 경우λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.
    λ‹¨μˆœνƒμƒ‰μ˜ 경우) 아무리 λŠλ €μ Έλ„ O(n)보닀 λŠλ €μ§€μ§„ μ•ŠμŒμ„ μ˜λ―Έν•œλ‹€.

예λ₯Ό λ“€μ–΄..

리슀트 크기가 n일 λ•Œ μ–΄λ–€ μ›μ†Œλ₯Ό 찾으렀면

  • λ‹¨μˆœ 탐색
    : n번 μ—°μ‚°ν•΄μ•Ό ν•œλ‹€ - O(n) 만큼 κ±Έλ¦°λ‹€κ³  ν‘œκΈ°ν•œλ‹€.
    (O(n) : nμ΄λΌλŠ” κ²°κ³Όλ₯Ό μœ„ν•΄ n번 μ—°μ‚°ν•΄μ•Ό 함을 의미)

  • 이진 탐색
    : log2 n번 μ—°μ‚°ν•΄μ•Ό ν•œλ‹€ - O(log n)만큼 κ±Έλ¦°λ‹€κ³  ν‘œκΈ°ν•œλ‹€.
    (O(log n) : nμ΄λΌλŠ” κ²°κ³Όλ₯Ό μœ„ν•΄ log2 n번 μ—°μ‚°ν•΄μ•Ό 함을 의미)

λΉ…μ˜€ ν‘œκΈ°λ²•μ—μ„œ logλŠ”..

λΉ…μ˜€ ν‘œκΈ°λ²•μ— λ‚˜νƒ€λ‚œ λͺ¨λ“  logν•¨μˆ˜λŠ” log2 (밑이 2인 둜그)λ₯Ό λœ»ν•œλ‹€.

많이 μ‚¬μš©ν•˜λŠ” λΉ…μ˜€ μ‹€ν–‰μ‹œκ°„

많이 μ‚¬μš©ν•˜λŠ” λΉ…μ˜€ μ‹€ν–‰μ‹œκ°„μ„ λ‹€μ„― 개만 μ•Œμ•„λ³Έλ‹€.

  • O(log n) , 둜그 μ‹œκ°„
    : λ‹€μ„― 개 쀑 κ°€μž₯ λΉ λ₯΄λ‹€.
    이진 탐색과 같은 경우.
  • O(n), μ„ ν˜• μ‹œκ°„
    : λ‹€μ„― 개 쀑 두 번째둜 λΉ λ₯΄λ‹€.
    λ‹¨μˆœ 탐색과 같은 경우.
  • O(n * log n)
    : λ‹€μ„― 개 쀑 μ„Έ 번째둜 λΉ λ₯΄λ‹€.
    퀡 μ •λ ¬κ³Ό 같은 경우.
  • O(n2) (n제곱)
    : λ‹€μ„― 개 쀑 λ„€ 번째둜 λΉ λ₯΄λ‹€.
    선택 μ •λ ¬κ³Ό 같은 경우.
  • O(n!) (nνŒ©ν† λ¦¬μ–Ό)
    : λ‹€μ„― 개 쀑 λ‹€μ„― 번째둜 λΉ λ₯΄λ‹€ (κ°€μž₯ λŠλ¦¬λ‹€).
    μ™ΈνŒμ› λ¬Έμ œμ™€ 같은 경우.