μ•Œκ³ λ¦¬μ¦˜

μ‹œκ°„ λ³΅μž‘λ„: νŠΉμ •ν•œ 크기의 μž…λ ₯에 λŒ€ν•˜μ—¬ μ•Œκ³ λ¦¬μ¦˜μ˜ μˆ˜ν–‰ μ‹œκ°„ 뢄석 곡간 λ³΅μž‘λ„: νŠΉμ •ν•œ 크기의 μž…λ ₯에 λŒ€ν•˜μ—¬ μ•Œκ³ λ¦¬μ¦˜μ˜ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰ 뢄석
λΉ…μ˜€ ν‘œκΈ°λ²•(Big-O Notation): λ³΅μž‘λ„λ₯Ό λ‚˜νƒ€λ‚΄κΈ° μœ„ν•œ ν‘œκΈ° 방법

  • κ°€μž₯ λΉ λ₯΄κ²Œ μ¦κ°€ν•˜λŠ” ν•­ 만 κ³ λ €ν•œλ‹€.
  • ex. 3N^3 + 5N^2 + 1,000,000 일 λ•Œ, λΉ…μ˜€ ν‘œκΈ°λ²•μ—μ„œλŠ” μ°¨μˆ˜κ°€ κ°€μž₯ 큰 O(N^3)으둜 ν‘œν˜„

img_1.png

Dynamic Programming

λ©”λͺ¨μ΄μ œμ΄μ…˜ (Memoization)

λ©”λͺ¨μ΄μ œμ΄μ…˜μ€ νƒ‘λ‹€μš΄ λ°©μ‹μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€. ν•œ 번 κ³„μ‚°λœ κ²°κ³Όλ₯Ό λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯ν•˜λŠ” κΈ°λ²•μž…λ‹ˆλ‹€.

  • 같은 문제λ₯Ό λ‹€μ‹œ ν˜ΈμΆœν•˜λ©΄ λ©”λͺ¨ν–ˆλ˜ κ²°κ³Όλ₯Ό κ·ΈλŒ€λ‘œ κ°€μ Έμ˜΅λ‹ˆλ‹€.
  • 값을 기둝해 λ†“λŠ”λ‹€λŠ” μ μ—μ„œ 캐싱(Caching) 이라고도 ν•©λ‹ˆλ‹€.

νƒ‘λ‹€μš΄ VS 보텀업

  • νƒ‘λ‹€μš΄(λ©”λͺ¨μ΄μ œμ΄μ…˜) 방식은 ν•˜ν–₯식이라고도 ν•˜λ©° 보톰업 방식은 상ν–₯식이라고도 ν•©λ‹ˆλ‹€.
  • λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°μ˜ μ „ν˜•μ μΈ ν˜•νƒœλŠ” 보텀업 λ°©μ‹μž…λ‹ˆλ‹€.
    • κ²°κ³Ό μ €μž₯용 λ¦¬μŠ€νŠΈλŠ” DP ν…Œμ΄λΈ”μ΄λΌκ³  λΆ€λ¦…λ‹ˆλ‹€.
  • μ—„λ°€νžˆ λ§ν•˜λ©΄ λ©”λͺ¨μ΄μ œμ΄μ…˜μ€ 이전에 κ³„μ‚°λœ κ²°κ³Όλ₯Ό μΌμ‹œμ μœΌλ‘œ 기둝해 λ†“λŠ” 넓은 κ°œλ…μ„ μ˜λ―Έν•©λ‹ˆλ‹€.
    • λ”°λΌμ„œ λ©”λͺ¨μ΄μ œμ΄μ…˜μ€ λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°μ— κ΅­ν•œλœ κ°œλ…μ€ μ•„λ‹™λ‹ˆλ‹€.
    • ν•œ 번 κ³„μ‚°λœ κ²°κ³Όλ₯Ό λ‹΄μ•„ λ†“κΈ°λ§Œ ν•˜κ³  λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°μ„ μœ„ν•΄ ν™œμš©ν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ° VS λΆ„ν•  정볡

  • λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°κ³Ό λΆ„ν•  정볡은 λͺ¨λ‘ 졜적 λΆ€λΆ„ ꡬ쑰λ₯Ό κ°€μ§ˆ λ•Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • 큰 문제λ₯Ό μž‘μ€ 문제둜 λ‚˜λˆŒ 수 있으며 μž‘μ€ 문제의 닡을 λͺ¨μ•„μ„œ 큰 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλŠ” 상황
  • λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°κ³Ό λΆ„ν•  μ •λ³΅μ˜ 차이점은 λΆ€λΆ„ 문제의 μ€‘λ³΅μž…λ‹ˆλ‹€.
    • λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ° λ¬Έμ œμ—μ„œλŠ” 각 λΆ€λΆ„ λ¬Έμ œλ“€μ΄ μ„œλ‘œ 영ν–₯을 미치며 λΆ€λΆ„ λ¬Έμ œκ°€ μ€‘λ³΅λ©λ‹ˆλ‹€.
    • λΆ„ν•  정볡 λ¬Έμ œμ—μ„œλŠ” λ™μΌν•œ λΆ€λΆ„ λ¬Έμ œκ°€ 반볡적으둜 κ³„μ‚°λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
      • λΆ„ν•  μ •λ³΅μ˜ λŒ€ν‘œμ μΈ μ˜ˆμ‹œμΈ 퀡 정렬을 μ‚΄νŽ΄λ΄…μ‹œλ‹€.
        • ν•œλ²ˆ κΈ°μ€€ μ›μ†Œ(Pivot)κ°€ 자리λ₯Ό λ³€κ²½ν•΄μ„œ 자리λ₯Ό 작으면 κ·Έ κΈ°μ€€ μ›μ†Œμ˜ μœ„μΉ˜λŠ” λ°”λ€Œμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
        • λΆ„ν•  이후에 ν•΄λ‹Ή 피벗을 λ‹€μ‹œ μ²˜λ¦¬ν•˜λŠ” λΆ€λΆ„ λ¬Έμ œλŠ” ν˜ΈμΆœν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ° λ¬Έμ œμ— μ ‘κ·Όν•˜λŠ” 방법

  • μ£Όμ–΄μ§„ λ¬Έμ œκ°€ λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ° μœ ν˜•μž„μ„ νŒŒμ•…ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.
  • κ°€μž₯ λ¨Όμ € 그리디, κ΅¬ν˜„, μ™„μ „ 탐색 λ“±μ˜ μ•„μ΄λ””μ–΄λ‘œ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλŠ”μ§€ κ²€ν† ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • λ‹€λ₯Έ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ 풀이 방법이 λ– μ˜€λ₯΄μ§€ μ•Šλ‹€λ©΄ λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°μ„ κ³ λ €ν•΄ λ΄…μ‹œλ‹€.
  • 일단 μž¬κ·€ ν•¨μˆ˜λ‘œ λΉ„νš¨μœ¨μ μΈ μ™„μ „ 탐색 ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•œ 뒀에 (νƒ‘λ‹€μš΄) μž‘μ€ λ¬Έμ œμ—μ„œ κ΅¬ν•œ 닡이 큰 λ¬Έμ œμ—μ„œ κ·ΈλŒ€λ‘œ μ‚¬μš©λ  수 있으면, μ½”λ“œλ₯Ό κ°œμ„ ν•˜λŠ” 방법을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 일반적인 μ½”λ”© ν…ŒμŠ€νŠΈ μˆ˜μ€€μ—μ„œλŠ” κΈ°λ³Έ μœ ν˜•μ˜ λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ° λ¬Έμ œκ°€ μΆœμ œλ˜λŠ” κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€.

완전탐색 (Exhaustive Search)

  • λͺ¨λ“  경우의 수λ₯Ό μ‹œλ„ν•΄λ³΄λŠ” 방법
  • μƒλŒ€μ μœΌλ‘œ κ΅¬ν˜„μ΄ κ°„λ‹¨ν•˜ ν•΄κ°€ μ‘΄μž¬ν•œλ‹€λ©΄ 항상 찾게 됨
  • 경우의 μˆ˜μ— 따라 μ‹€ν–‰ μ‹œκ°„μ΄ λΉ„λ‘€ν•˜κΈ° λ•Œλ¬Έμ— μž…λ ₯ κ°’μ˜ λ²”μœ„κ°€ μž‘μ€ κ²½μš°μ— 유용

DFS & BFS

  • λŒ€ν‘œμ μΈ κ·Έλž˜ν”„ 탐색 μ•Œκ³ λ¦¬μ¦˜
  • 탐색(Search)μ΄λž€ λ§Žμ€ μ–‘μ˜ 데이터 쀑 μ›ν•˜λŠ” 데이터λ₯Ό μ°ΎλŠ” 과정을 말함
  • 깊이 μš°μ„  탐색, κ·Έλž˜ν”„μ—μ„œ κ°€μž₯ κΉŠμ€ 뢀뢄을 μš°μ„ μ μœΌλ‘œ 탐색
  • DFSλŠ” μŠ€νƒ 자료ꡬ쑰 (ν˜Ήμ€ μž¬κ·€ν•¨μˆ˜)λ₯Ό 이용
  • λ„ˆλΉ„ μš°μ„  탐색, κ·Έλž˜ν”„μ—μ„œ κ°€μž₯ κ°€κΉŒμš΄ λ…Έλ“œλΆ€ν„° 탐색
  • BFSλŠ” 큐 자료ꡬ쑰 μ‚¬μš© (ex. μ΅œλ‹¨κ±°λ¦¬ λ¬Έμ œμ—μ„œ 자주 μ‚¬μš©)

μŠ€νƒ 자료ꡬ쑰

  • λ¨Όμ € λ“€μ–΄μ˜¨ 데이터가 λ‚˜μ€‘μ— λ‚˜κ°€λŠ” ν˜•μ‹(μ„ μž…ν›„μΆœ LIFO)
  • μž…κ΅¬μ™€ μΆœκ΅¬κ°€ 동일

큐 자료ꡬ쑰

  • λ¨Όμ € λ“€μ–΄μ˜¨ 데이터가 λ¨Όμ € λ‚˜κ°€λŠ” ν˜•μ‹(μ„ μž…μ„ μΆœ FIFO)
  • μž…κ΅¬μ™€ μΆœκ΅¬κ°€ λͺ¨λ‘ 뚫렀 μžˆλŠ” 터널과 같은 ν˜•νƒœ

μœ ν΄λ¦¬λ“œ ν˜Έμ œλ²•

  • λ‘κ°œμ˜ μ΅œλŒ€ κ³΅μ•½μˆ˜λ₯Ό κ΅¬ν•˜λŠ” λŒ€ν‘œμ μΈ μ•Œκ³ λ¦¬μ¦˜
  • 두 μžμ—°μˆ˜ A, B에 λŒ€ν•˜μ—¬ (A > B) Aλ₯Ό B둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό R이라고 ν•©μ‹œλ‹€.
  • μ΄λ•Œ A와 B의 μ΅œλŒ€κ³΅μ•½μˆ˜λŠ” B와 R의 μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

μ •λ ¬

  • μ •λ ¬(Sorting)μ΄λž€ 데이터λ₯Ό νŠΉμ •ν•œ 기쀀에 따라 μˆœμ„œλŒ€λ‘œ λ‚˜μ—΄ν•˜λŠ” 것
  • 문제 상황에 따라 μ μ ˆν•œ μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ΄ κ³΅μ‹μ²˜λŸΌ μ‚¬μš©λ¨

선택 μ •λ ¬

  • μ²˜λ¦¬λ˜μ§€ μ•Šμ€ 데이터 쀑 κ°€μž₯ μž‘μ€ 데이터λ₯Ό 선택해 맨 μ•žμ— μžˆλŠ” 데이터와 λ°”κΎΈλŠ” 것을 반볡
  • μ‹œκ°„ λ³΅μž‘λ„: O(N^2)

μ‚½μž… μ •λ ¬

  • μ²˜λ¦¬λ˜μ§€ μ•Šμ€ 데이터λ₯Ό ν•˜λ‚˜μ”© 골라 μ μ ˆν•œ μœ„μΉ˜μ— μ‚½μž…
  • 선택 정렬에 λΉ„ν•΄ κ΅¬ν˜„ν•˜κΈ° μ–΄λ ΅μ§€λ§Œ 일반적으둜 보닀 효율적

μˆœμ°¨νƒμƒ‰μ€ μ–΄λ– ν•œ 값을 찾고자 ν•  λ•Œ ν•˜λ‚˜μ”© λΉ„κ΅ν•΄λ³΄λŠ” 방법을 λ§ν•©λ‹ˆλ‹€.

이진탐색

이진탐색은 λ²”μœ„μ˜ 쀑간 값을 μ°Ύμ•„ μ°ΎμœΌλ €λŠ” κ°’κ³Ό λΉ„κ΅ν•˜μ—¬ λ²”μœ„λ₯Ό μ’ν˜€λ‚˜κ°€λŠ” 방법을 λ§ν•©λ‹ˆλ‹€.

μ΄μ§„νƒμƒ‰μ˜ 경우 정렬이 잘 λ˜μ–΄μžˆλŠ” 경우 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

νƒμš•λ²•

그리디 μ•Œκ³ λ¦¬μ¦˜μ΄λž€ ν˜„μž¬ μƒν™©μ—μ„œ κ°€μž₯ 쒋은 μ΅œμ„ μ˜ 선택을 κ³ λ₯΄λŠ” μ•Œκ³ λ¦¬μ¦˜μ„ λ§ν•©λ‹ˆλ‹€. 그리디 μ•Œκ³ λ¦¬μ¦˜μ€ κ°„λ‹¨ν•œ 문제 해결에 λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°μ„ μ‚¬μš©ν•˜λ©΄ μ§€λ‚˜μΉ˜κ²Œ λ§Žμ€ 일을 ν•œλ‹€λŠ” κ²ƒμ—μ„œ κ³ μ•ˆλœ μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€. λ”°λΌμ„œ 그리디 μ•Œκ³ λ¦¬μ¦˜μ€ μ΅œμ ν•΄λ₯Ό 보μž₯ν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.

κ΅¬ν˜„

κ΅¬ν˜„μ΄λž€ 머릿속에 μžˆλŠ” μ•Œκ³ λ¦¬μ¦˜μ„ μ†ŒμŠ€μ½”λ“œλ‘œ λ°”κΎΈλŠ” κ³Όμ •μž…λ‹ˆλ‹€.

  • μ•Œκ³ λ¦¬μ¦˜μ€ κ°„λ‹¨ν•œλ° μ½”λ“œκ°€ κΈΈμ–΄μ§€λŠ” 문제
  • μ‹€μˆ˜ 연산을 닀루고 νŠΉμ • μ†Œμˆ˜μ κΉŒμ§€ 좜λ ₯ν•΄μ•Όν•˜λŠ” 문제
  • λ¬Έμžμ—΄μ„ νŠΉμ •ν•œ 기쀀에 따라 λŠμ–΄ μ²˜λ¦¬ν•΄μ•Όν•˜λŠ” 문제
  • μ μ ˆν•œ 라이브러리λ₯Ό μ°Ύμ•„ μ‚¬μš©ν•΄μ•Όν•˜λŠ” 문제

ν•΄μ‹œ (Hash)

  • μž„μ˜μ˜ 크기λ₯Ό κ°€μ§„ 데이터(Key)λ₯Ό κ³ μ •λœ 크기의 데이터(Value)둜 λ³€ν™”μ‹œμΌœ μ €μž₯ν•˜λŠ” 것
  • 킀에 λŒ€ν•œ ν•΄μ‹œ 값을 μ‚¬μš©ν•˜μ—¬ 값을 μ €μž₯ν•˜κ³  ν‚€-κ°’ 쌍의 κ°―μˆ˜μ— 따라 λ™μ μœΌλ‘œ 크기가 μ¦κ°€ν•˜λŠ” μ—°κ΄€ λ°°μ—΄
  • 킀에 λŒ€ν•œ ν•΄μ‹œ 값을 κ΅¬ν•˜λŠ” 과정을 ν•΄μ‹±(Hashing)이라고 ν•˜λ©° μ΄λ•Œ μ‚¬μš©ν•˜λŠ” ν•¨μˆ˜(μ•Œκ³ λ¦¬μ¦˜) ν•΄μ‹œ ν•¨μˆ˜(Hash Function)이라고 ν•œλ‹€.
  • ν•΄μ‹œ κ°’ 자체λ₯Ό index둜 μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— 평균 μ‹œκ°„ λ³΅μž‘λ„κ°€ O(1)둜 맀우 빠름

μ—°κ΄€ λ°°μ—΄?
μ—°κ΄€ λ°°μ—΄(associative array)은 자료ꡬ쑰의 ν•˜λ‚˜λ‘œ, ν‚€ ν•˜λ‚˜μ™€ κ°’ ν•˜λ‚˜κ°€ μ—°κ΄€λ˜μ–΄ 있으며 ν‚€λ₯Ό 톡해 μ—°κ΄€λ˜λŠ” 값을 얻을 수 μžˆλ‹€.

ν•΄μ‹œ ν•¨μˆ˜ (Hash Function)

  • μž„μ˜μ˜ 길이의 데이터λ₯Ό μž…λ ₯λ°›μ•„ μΌμ •ν•œ 길이의 λΉ„νŠΈμ—΄λ‘œ λ°˜ν™˜μ‹œμΌœμ£ΌλŠ” ν•¨μˆ˜
  • μ›λž˜μ˜ κ°’μ΄λ‚˜ ν‚€λ₯Ό μƒ‰μΈν•˜λŠ”λ° μ‚¬μš©λ˜λ©°, κ·Έ 값이 κ΄€λ ¨λœ 데이터가 검색될 λ•Œλ§ˆλ‹€ λ‹€μ‹œ μ‚¬μš©λœλ‹€.
  • λ°μ΄ν„°μ˜ 효율적 관리λ₯Ό λͺ©μ μœΌλ‘œ μž„μ˜μ˜ 길이의 데이터λ₯Ό κ³ μ •λœ 길이의 λ°μ΄ν„°λ‘œ λ§€ν•‘ν•˜λŠ” ν•¨μˆ˜
  • 계산이 λ³΅μž‘ν•˜μ§€ μ•Šκ³  쀑볡 ν‚€ κ°’ 없이 ν•΄μ‹œκ°’μ„ κ³ λ₯΄κ²Œ λ§Œλ“œλŠ” ν•¨μˆ˜κ°€ μ’‹λ‹€. (좩돌이 μΌμ–΄λ‚˜μ§€ μ•Šμ„μˆ˜λ‘)
  • λ¬Έμžμ—΄(string)을 λ°›μ•„μ„œ 숫자λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜ (ν•¨μˆ˜λŠ” λ¬Έμžμ—΄μ— λŒ€ν•΄ 숫자λ₯Ό λ§€ν•‘)

ν•΄μ‹± (Hashing)

  • ν‚€ 값에 μ‚°μˆ  연산을 μ μš©ν•˜μ—¬ μ €μž₯λ˜μ–΄ μžˆλŠ” ν…Œμ΄λΈ”μ˜ μ£Όμ†Œλ₯Ό κ³„μ‚°ν•˜μ—¬ ν•­λͺ©μ— μ ‘κ·Ό
  • λ§€ν•‘ν•˜λŠ” 과정을 λ§ν•œλ‹€.
  • ν‚€(key): λ§€ν•‘ μ „ μ›λž˜ 데이터 κ°’
  • ν•΄μ‹œκ°’: λ§€ν•‘ ν›„ 데이터

μž₯점

  • ν•΄μ‹œ 좩돌이 λ°œμƒν•  κ°€λŠ₯성이 μžˆμ§€λ§Œ, 적은 λ¦¬μ†ŒμŠ€λ‘œ λ§Žμ€ 데이터λ₯Ό 효율적으둜 관리할 수 있음
  • index에 ν•΄μ‹œ 값을 μ‚¬μš©ν•˜λ―€λ‘œ λͺ¨λ“  데이터λ₯Ό μ‚΄ν”Όμ§€ μ•Šμ•„λ„ 검색과 μ‚½μž…/μ‚­μ œλ₯Ό λΉ λ₯΄κ²Œ μˆ˜ν–‰
  • ν•΄μ‹œ ν•¨μˆ˜λŠ” μ–Έμ œλ‚˜ λ™μΌν•œ ν•΄μ‹œ 값을 λ¦¬ν„΄ν•˜κ³  index만 μ•Œλ©΄ ν•΄μ‹œ ν…Œμ΄λΈ”μ˜ 크기와 상관없이 데이터에 λΉ λ₯΄κ²Œ μ ‘κ·Ό κ°€λŠ₯
  • 데이터 μ—‘μ„ΈμŠ€(μ‚½μž…, μ‚­μ œ, 탐색)μ‹œ μ‹œκ°„ λ³΅μž‘λ„ O(1)을 μ§€ν–₯ν•œλ‹€.

Refer

https://coding-sojin2.tistory.com/entry/%ED%95%B4%EC%8B%9C-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-hash-algorithm