day74 πŸŒ•

μž₯λ―ΈΒ·2022λ…„ 8μ›” 27일
0

였늘의 μ„±κ³Ό

λͺ©λ‘ 보기
74/129

μŠ€ν”„λ§ DB 1편 - 데이터 μ ‘κ·Ό 핡심 원리 μ„Ήμ…˜5 μ΄μ–΄μ„œ μˆ˜κ°•


ν† ν”½ 1개 - 동적 κ³„νšλ²• dp

+) 22. 08. 30. μ •λ¦¬ν•œ κ±° μΆ”κ°€!

Dynamic Programming은 Optimization Problem을 ν•΄κ²°ν•˜λŠ” μ „λž΅ 쀑 ν•˜λ‚˜μ΄λ‹€.
μ—¬κΈ°μ„œ Optimization Problemμ΄λž€, 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 졜적의 λ‹΅(Optimal Solution)을 μ°Ύμ•„μ•Ό ν•˜λŠ” 문제λ₯Ό λœ»ν•œλ‹€.

Optimal Solution은 ν•˜λ‚˜ 이상일 수 있으며, μ΅œλŒ€ ν˜Ήμ€ μ΅œμ†Œκ°’μ„ κ°€μ§€λŠ” Solution을 μ°ΎλŠ” λ¬Έμ œλ“€μ΄ μ£Όλ₯Ό 이룬닀. (예: κ°€μž₯ 빨리 λ„μ°©ν•˜λŠ” 경둜(Solution)의 μ†Œμš” μ‹œκ°„(Value)은? 등…)

DPλŠ” ν•΄κ²°ν•˜λ €λŠ” 문제λ₯Ό μ’€ 더 μž‘μ€ 크기의 SubProblem으둜 λ‚˜λˆ„κ³ , κ·Έ SubProblem의 Optimal Solution을 ν™œμš©ν•˜μ—¬ μ›λž˜ Problem의 Optimal Solution을 μ°ΎλŠ” 방식이닀.

μ—¬κΈ°μ„œ 문제λ₯Ό 계속 잘게 μͺΌκ°œλ‹€ 보면, μ–΄λŠ μˆœκ°„ κ²ΉμΉ˜λŠ”(Overlapping) SubProblem이 생긴닀. 그럴 λ•Œ 이 μ„œλΈŒ λ¬Έμ œλ“€μ„ 계속 κ³„μ‚°ν•˜λŠ” 것이 μ•„λ‹ˆλΌ 맨 처음 ν•œ 번만 계산을 ν•˜κ³ , κ·Έ κ²°κ³Όλ₯Ό μ €μž₯ν•œ 뒀에 ν•„μš”ν•˜λ‹€λ©΄ 또 μž¬μ‚¬μš©ν•œλ‹€.

DP의 두 가지 μ ‘κ·Ό 방식

Top-Down ApproachBottom-Up Approach
ꡬ쑰Recursive(μž¬κ·€)Iterative(for-loop)
SubProblem κ²°κ³Ό μ €μž₯MemoizationTabulation
μ„ ν˜Έλ˜λŠ” 상황SubProblems의 μΌλΆ€λ§Œ 계산해도 μ΅œμ’… Optimal Solution을 ꡬ할 수 μžˆμ„ λ•Œλͺ¨λ“  SubProblemsλ₯Ό 계산해야 μ΅œμ’… Optimal Solution을 ꡬ할 수 μžˆμ„ λ•Œ

Top-Down ApproachλŠ” λ¬Έμ œλ“€μ„ μž‘μ€ 크기의 문제둜 λ‚˜λˆ„μ–΄μ„œ ν•΄κ²°ν•˜λŠ” 것이고, Bottom-Up ApproachλŠ” 일단 μž‘μ€ 크기의 λ¬Έμ œλΆ€ν„° μ°¨κ·Όμ°¨κ·Ό ν•΄κ²°ν•΄ λ‚˜κ°€λŠ” 것이닀.

DPλ₯Ό μ‚¬μš©ν•œ μ•Œκ³ λ¦¬μ¦˜ 섀계 μˆœμ„œ

  1. 주어진 문제의 Optimal Solution이 ꡬ쑰적으둜 μ–΄λ–€ νŠΉμ§•μ„ κ°€μ§€λŠ”μ§€ λΆ„μ„ν•œλ‹€.
  2. μž¬κ·€μ μΈ ν˜•νƒœλ‘œ Optimal Solution의 Valueλ₯Ό μ •μ˜ν•œλ‹€.
  3. (주둜) Bottom-Up λ°©μ‹μœΌλ‘œ Optimal Solution의 Valueλ₯Ό κ΅¬ν•œλ‹€.
  4. μ§€κΈˆκΉŒμ§€ κ³„μ‚°λœ 정보λ₯Ό λ°”νƒ•μœΌλ‘œ Optimal Solution을 κ΅¬ν•œλ‹€. (Optimal Solution을 ꡬ해야 ν•  경우)

예제

Climbing Stairs
μ •μƒκΉŒμ§€ 였λ₯΄λŠ” 데 n번의 μŠ€ν…μ΄ ν•„μš”ν•œ 계단이 μžˆλ‹€. ν•œ λ²ˆμ— ν•œ μŠ€ν…, ν˜Ήμ€ 두 μŠ€ν…μ„ 였λ₯Ό 수 μžˆμ„ λ•Œ, κ³„λ‹¨μ˜ μ •μƒκΉŒμ§€ 였λ₯΄κΈ° μœ„ν•΄μ„œλŠ” λͺ‡ 개의 μœ λ‹ˆν¬ν•œ 방법이 μžˆλŠ”μ§€ κ΅¬ν•˜μ‹œμ˜€.

예1: n = 2 β†’ λ‹΅ = 2 (1step + 1step, 2steps)
예2: n = 3 β†’ λ‹΅ = 3 (1step + 1step + 1step, 1step + 2steps, 2steps + 1step)

μœ„ λ¬Έμ œλŠ” Optimization Problem이닀.

총 λͺ‡ 개의 μœ λ‹ˆν¬ν•œ 방법이 μžˆλŠ”μ§€ κ΅¬ν•œλ‹€λŠ” 것은 μ΅œλŒ€ λͺ‡ 개의 μœ λ‹ˆν¬ν•œ 방법이 μžˆλŠ”μ§€λ₯Ό λ¬Όμ–΄λ³΄λŠ” 것과 λ™μΌν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

f(n) = nμŠ€ν…μ˜ 계단을 였λ₯΄λŠ” μœ λ‹ˆν¬ν•œ 방법 수일 λ•Œ,
➑️ f(n) = f(n-1) + f(n-2)

def climb(n:int) -> int:
	if n <= 2: #μž¬κ·€ ν•¨μˆ˜μ—μ„œμ˜ νƒˆμΆœ 쑰건
		return n
	return climb(n-1) + climb(n-2)
Recursion λ°©μ‹μœΌλ‘œ ν‘Ό μ½”λ“œ

μœ„ μ½”λ“œλŠ” DPλ₯Ό μ μš©ν•œ 것이 μ•„λ‹ˆλΌ Recursion 방식을 μ μš©ν•œ μ½”λ“œλ‹€. Recursion 방식을 μ μš©ν•˜λ©΄ μ•„λž˜ 이미지와 같이 쀑볡 호좜이 λ°œμƒν•œλ‹€.

climb(6)을 ν˜ΈμΆœν–ˆμ„ 경우

climb(6)을 ν˜ΈμΆœν–ˆμ„ 경우

μ΄λ ‡κ²Œ κ²ΉμΉ˜λŠ” SubProblem듀이 λ§Žμ„ λ•Œ, λ™μΌν•œ Input에 λŒ€ν•œ Function Call은 처음 ν•œ 번만 κ³„μ‚°ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό λ©”λͺ¨ν•΄ λ’€λ‹€κ°€, 이후에 μž¬μ‚¬μš©ν•˜λŠ” λ°©μ‹μœΌλ‘œ ν•΄κ²°ν•˜λ©΄ λœλ‹€.

memo = {} #Function Call에 λŒ€ν•œ κ²°κ³Όλ₯Ό μ €μž₯ν•  곡간

def climb(n:int) -> int:
	if n in memo:
		return memo[n]
	if n <= 2: #μž¬κ·€ ν•¨μˆ˜μ—μ„œμ˜ νƒˆμΆœ 쑰건
		return n
	memo[n] = climb(n-1) + climb(n-2)
	return climb(n-1) + climb(n-2)
Top-Down 방식 μ‚¬μš©(Memoization)

Bottom-Up 방식 μ‚¬μš©

def climb(n:int) -> int:
	tabular = {1:1, 2:2}
	for i in range(3, n+1):
		tabular[i] = tabular[i-1] + tabular[i-2]
	return tabular[n]
Iterative(반볡문) μ‚¬μš©, Tabulation 방식

Tabulation: μž‘μ€ SubProblemλΆ€ν„° μ‹œμž‘ν•΄μ„œ μ΅œμ’… Problem κ²°κ³Όλ₯Ό λ„μΆœν•  λ•ŒκΉŒμ§€ κ²°κ³Όλ₯Ό μ°¨λ‘€λŒ€λ‘œ κΈ°λ‘ν•˜λŠ” 것.

μ‹œκ°„ λ³΅μž‘λ„ 비ꡐ

RecursionDP: Top-DownDP: Bottom-Up
μ‹œκ°„ λ³΅μž‘λ„O(2^n)O(n)O(n)

➑️ DPλ₯Ό μ‚¬μš©ν•˜λ©΄ μ„±λŠ₯ λ©΄μ—μ„œ κ°œμ„ μ΄ λœλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.

μ–Έμ œ DPλ₯Ό μ‚¬μš©ν•˜λ©΄ 될까?

DPλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„  λ‹€μŒκ³Ό 같은 쑰건이 ν•„μš”ν•˜λ‹€.

  1. Optimization Problem이 Optimal Substructureμ—¬μ•Ό ν•œλ‹€.
    β†’ Optimization Problem의 Optimal Solution이 Subproblem의 Optimal Solution을 ν¬ν•¨ν•˜λŠ” ꡬ쑰여야 ν•œλ‹€.

    즉, λΆ€λΆ„ 문제의 졜적 κ²°κ³Ό 값을 μ‚¬μš©ν•΄ 전체 문제의 졜적 κ²°κ³Όλ₯Ό λ‚Ό 수 μžˆλŠ” 경우λ₯Ό μ˜λ―Έν•œλ‹€. (λΆ€λΆ„ λ¬Έμ œμ—μ„œ κ΅¬ν•œ 졜적 κ²°κ³Όκ°€ 전체 λ¬Έμ œμ—μ„œλ„ λ™μΌν•˜κ²Œ μ μš©λ˜μ–΄ κ²°κ³Όκ°€ λ³€ν•˜μ§€ μ•Šμ„ λ•Œ DPλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.)

    예: f(n) = f(n-1) + f(n-2)

    μ—¬κΈ°μ„œ μ£Όμ˜ν•  점은, SubproblemsλŠ” 독립적이어야 ν•œλ‹€. 즉, Subproblem의 Solution은 λ‹€λ₯Έ Subproblem의 Solution에 영ν–₯을 μ£Όλ©΄ μ•ˆ λœλ‹€λŠ” λœ»μ΄λ‹€.

  2. Optimization Problem이 Overlapping Subproblemsλ₯Ό κ°€μ Έμ•Ό ν•œλ‹€.
    β†’ μž¬κ·€μ  ν˜•νƒœμ˜ μ•Œκ³ λ¦¬μ¦˜μ΄ λ™μž‘ν•  λ•Œ, λ™μΌν•œ Subproblemsλ₯Ό μ—¬λŸ¬ 번 ν•΄κ²°ν•΄μ•Ό ν•œλ‹€λ©΄ ν•΄λ‹Ή λ¬Έμ œλŠ” Overlapping Subproblemsλ₯Ό 가진닀고 ν‘œν˜„ν•œλ‹€.

    즉, λ™μΌν•œ μž‘μ€ λ¬Έμ œλ“€μ΄ λ°˜λ³΅ν•˜μ—¬ λ‚˜νƒ€λ‚˜λŠ” κ²½μš°μ— μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

λΆ„ν•  정볡과 동적 ν”„λ‘œκ·Έλž˜λ°μ˜ 차이점

λΆ„ν•  정볡과 DPλŠ”, 주어진 문제λ₯Ό μž‘κ²Œ μͺΌκ°œμ„œ ν•˜μœ„ 문제둜 ν•΄κ²°ν•˜κ³  μ—°κ³„μ μœΌλ‘œ 큰 문제λ₯Ό ν•΄κ²°ν•œλ‹€λŠ” 점은 κ°™λ‹€.
ν•˜μ§€λ§Œ λΆ„ν•  정볡은 λΆ„ν• λœ ν•˜μœ„ λ¬Έμ œκ°€ λ™μΌν•˜κ²Œ 쀑볡이 μΌμ–΄λ‚˜μ§€ μ•ŠλŠ” κ²½μš°μ— μ“°λ©°, DPλŠ” λ™μΌν•œ 쀑볡이 일어날 경우 μ“΄λ‹€.

정리

일반적인 μž¬κ·€λ₯Ό λ‹¨μˆœνžˆ μ‚¬μš© μ‹œ λ™μΌν•œ μž‘μ€ λ¬Έμ œλ“€μ΄ μ—¬λŸ¬ 번 λ°˜λ³΅λ˜μ–΄ λΉ„νš¨μœ¨μ μΈ 계산이 될 수 μžˆλ‹€.
κ·ΈλŸ¬λ‚˜ ν•œ 번 κ΅¬ν•œ μž‘μ€ 문제의 κ²°κ³Ό 값을 μ €μž₯해두고 μž¬μ‚¬μš©ν•œλ‹€λ©΄, μ•žμ—μ„œ κ³„μ‚°λœ 값을 λ‹€μ‹œ λ°˜λ³΅ν•  ν•„μš”κ°€ μ—†μ–΄ 맀우 효율적으둜 문제λ₯Ό ν•΄κ²°ν•  수 있게 λœλ‹€.

DPλŠ” νŠΉμ •ν•œ κ²½μš°μ— μ‚¬μš©ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄ μ•„λ‹ˆλΌ ν•˜λ‚˜μ˜ λ°©λ²•λ‘ μ΄λ―€λ‘œ λ‹€μ–‘ν•œ 문제 해결에 쓰일 수 μžˆλ‹€.

Bottom-Up 방식은 μ•„λž˜μ—μ„œλΆ€ν„° 계산을 μˆ˜ν–‰ν•˜κ³ , λˆ„μ μ‹œμΌœμ„œ μ „μ²΄μ˜ 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 방식이닀.
dp[0]κ°€ κΈ°μ € μƒνƒœ(κ°€μž₯ μž‘μ€ 문제의 μƒνƒœ)이고, dp[n]을 λͺ©ν‘œ μƒνƒœλΌ ν•  λ•Œ, Bottom-Up 방식은 dp[0]λΆ€ν„° μ‹œμž‘ν•˜μ—¬ λ°˜λ³΅λ¬Έμ„ 톡해 μ ν™”μ‹μœΌλ‘œ κ²°κ³Όλ₯Ό λ‚΄μ„œ dp[n]κΉŒμ§€ κ·Έ 값을 μ „μ΄μ‹œμΌœ μž¬ν™œμš©ν•˜λŠ” 방식이닀.

Top-Down 방식은 dp[n]의 값을 μ°ΎκΈ° μœ„ν•΄ μœ„μ—μ„œλΆ€ν„° ν˜ΈμΆœμ„ μ‹œμž‘ν•˜μ—¬ dp[0]의 μƒνƒœκΉŒμ§€ λ‚΄λ €κ°„ λ‹€μŒ, ν•΄λ‹Ή κ²°κ³Ό 값을 μž¬κ·€λ₯Ό 톡해 μ „μ΄μ‹œμΌœ μž¬ν™œμš©ν•˜λŠ” 방식이닀.


참고 자료

  1. 겐지좩 ν”„λ‘œκ·Έλž˜λ¨Έ, β€œμ•Œκ³ λ¦¬μ¦˜ - Dynamic Programming(동적 κ³„νšλ²•)”, https://hongjw1938.tistory.com/47

  2. μ‰¬μš΄μ½”λ“œ, β€œμ½”λ”©ν…ŒμŠ€νŠΈμ—μ„œ 많이 μ‚¬μš©λ˜λŠ” dynamic programming(λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°, 동적 κ³„νšλ²•)의 κ°œλ…κ³Ό μ–Έμ œ μ–΄λ–»κ²Œ μ‚¬μš©ν•  수 μžˆλŠ”μ§€ 두 가지 예제λ₯Ό 톡해 μ‚΄νŽ΄λ΄…λ‹ˆλ‹€~”, https://youtu.be/GtqHli8HIqk


ν”„λ‘œμ νŠΈ 주제 μƒκ°ν•˜κΈ°

profile
김뉴비

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보