๊ณตํต์
- ๋ณต์กํ ๋ฌธ์ ๋ฅผ ๋ ์์ ๋ถ๋ถ ๋ฌธ์ ๋ก ๋๋์ด ํด๊ฒฐํ๋ ๋ฐฉ์
- ๋๊ฒ ์ต์ ํ ๋ฌธ์ ๋ ์กฐํฉ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ฐ์ ์ฌ์ฉํ๋ค.
์ฐจ์ด์
์ฌ๊ท
ํน์ง
- ํจ์๊ฐ ์๊ธฐ ์์ ์ ํธ์ถํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ
- ์ข ๋ฃ์กฐ๊ฑด(base case)์ด ํ์์
์์
: ํฉํ ๋ฆฌ์ผ ๊ณ์ฐ, ํ๋ ธ์ด ํ, ํผ๋ณด๋์น ์์ด
# ํผ๋ณด๋์น ์์ด
def factorial(n):
if n == 0 or n == 1:
return 1
return n * factorial(n-1)
# ํ๋
ธ์ด ํ
def hanoi_tower(n, start, end, middle):
if n == 1:
print(f"์๋ฐ 1์ {start}์์ {end}์ผ๋ก ์ฎ๊น๋๋ค.")
return
hanoi_tower(n-1, start, middle, end)
print(f"์๋ฐ {n}์ {start}์์ {end}์ผ๋ก ์ฎ๊น๋๋ค.")
hanoi_tower(n-1, middle, end, start)
# ์ฌ์ฉ ์
n = 3 # ์๋ฐ์ ๊ฐ์
hanoi_tower(n, 'A', 'C', 'B')
# ์คํ ๊ฒฐ๊ณผ
์๋ฐ 1์ A์์ C์ผ๋ก ์ฎ๊น๋๋ค.
์๋ฐ 2์ A์์ B์ผ๋ก ์ฎ๊น๋๋ค.
์๋ฐ 1์ C์์ B์ผ๋ก ์ฎ๊น๋๋ค.
์๋ฐ 3์ A์์ C์ผ๋ก ์ฎ๊น๋๋ค.
์๋ฐ 1์ B์์ A์ผ๋ก ์ฎ๊น๋๋ค.
์๋ฐ 2์ B์์ C์ผ๋ก ์ฎ๊น๋๋ค.
์๋ฐ 1์ A์์ C์ผ๋ก ์ฎ๊น๋๋ค.
- ์ฅ์ : ๊ตฌํ์ด ์ง๊ด์ ์ด๊ณ ๊ฐ๋จํ๋ค.
- ๋จ์ : ์ค๋ณต ๊ณ์ฐ์ด ๋ง์ด ๋ฐ์ํ ์ ์์ด ๋นํจ์จ์ ์ผ ์ ์์.
๋ฐฑํธ๋ํน(Backtracking)
ํน์ง
- ๊ฐ๋ฅํ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ํ๋ ์์ ํ์ ๊ธฐ๋ฒ
- ํด๋ฅผ ์ฐพ๋ ๋์ค ํด๊ฐ ์๋๋ฉด ๋๋์๊ฐ์ ๋ค์ ํ์
์์
: N-Queens, ์ค๋์ฟ , ๋ถ๋ถ์งํฉ์ ํฉ
# N-Queens
def solve_n_queens(n):
def is_safe(board, row, col):
# ๊ฐ์ ์ด, ๋๊ฐ์ ์ฒดํฌ
for i in range(row):
if board[i] == col or \
board[i] - i == col - row or \
board[i] + i == col + row:
return False
return True
def backtrack(board, row):
if row == n:
solutions.append(board[:])
return
for col in range(n):
if is_safe(board, row, col):
board[row] = col
backtrack(board, row + 1)
solutions = []
backtrack([-1] * n, 0)
return solutions
- ์ฅ์ : ๋ถํ์ํ ํ์์ ์ค์ฌ ํจ์จ์ฑ์ ๋์ ๐ ๊ฐ์ง์น๊ธฐ(pruning)
- ๋จ์ : ์ต์ ์ ๊ฒฝ์ฐ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๋ค ์ดํด๋ด์ผ ํ ์ ์๋ค.
๋์ ๊ณํ๋ฒ(DP, Dynamic Programming)
ํน์ง
- ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ถ๋ถ ๋ฌธ์ ๋ก ๋๋์ด ํด๊ฒฐ
- ๋ถ๋ถ ๋ฌธ์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ์ฌ ์ฌ์ฌ์ฉ(๋ฉ๋ชจ์ด์ ์ด์ )
์์
: ํผ๋ณด๋์น ์์ด, ์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด(LIS), ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด(LCS), ๋ฐฐ๋ญ ๋ฌธ์ (Knapsack)
# ํผ๋ณด๋์น ์์ด
def fibonacci(n):
if n <= 1:
return n
dp = [0] * (n + 1)
dp[1] = 1
for i in range(2, n + 1):
dp[i] = dp[i-1] + dp[i-2]
return dp[n]
# ์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด(LIS)
def longest_increasing_subsequence(arr):
n = len(arr)
# dp[i]๋ arr[i]๋ก ๋๋๋ ์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด์ ๊ธธ์ด
dp = [1] * n
for i in range(1, n):
for j in range(i):
if arr[i] > arr[j]:
dp[i] = max(dp[i], dp[j] + 1)
# ๊ฐ์ฅ ๊ธด ์ฆ๊ฐ ๋ถ๋ถ ์์ด์ ๊ธธ์ด ๋ฐํ
return max(dp)
# ์ฌ์ฉ ์
arr = [10, 22, 9, 33, 21, 50, 41, 60, 80]
print(longest_increasing_subsequence(arr)) # ์ถ๋ ฅ: 6
- ์ฅ์ : ์ค๋ณต ๊ณ์ฐ์ ํผํด ํจ์จ์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐ
- ๋จ์ : ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ฆ๊ฐํ ์ ์๋ค.
๊ฐ๋จํ ๋น์
์ฌ๊ท: ํฐ ํผ์ฆ์ ์์ ํผ์ฆ๋ก ๋๋์ด ํธ๋ ๊ฒ
๋ฐฑํธ๋ํน: ๋ฏธ๋ก์์ ๋ง๋ค๋ฅธ ๊ธธ์ ๋ง๋๋ฉด ๋๋์๊ฐ์ ๋ค๋ฅธ ๊ธธ์ ์ฐพ๋ ๊ฒ
๋์ ๊ณํ๋ฒ: ์ด๋ฏธ ํผ ์ํ ๋ฌธ์ ์ ๋ต์ ๋ฉ๋ชจํด๋๊ณ ๋ค์์ ์ฌ์ฌ์ฉํ๋ ๊ฒ
๊ฐ ๋ฐฉ๋ฒ์ ๋ฌธ์ ์ ํน์ฑ์ ๋ฐ๋ผ ์ ํ์ ์ผ๋ก ์ฌ์ฉ๋๋ฉฐ, ๋๋ก๋ ํจ๊ป ์ฌ์ฉ๋๊ธฐ๋ ํ๋ค.
์ด ์ ์ ์์ ํ ๋ณ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ ๋ณด๊ธด ์ด๋ ต๋ค. ์๋ก ์ฐ๊ด๋๋ฉฐ ์ค์ฒฉ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.
- ๋ฐฑํธ๋ํน, ๋์ ๊ณํ๋ฒ ๋ชจ๋ ์ฌ๊ท๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ ๊ฐ๋ฅ
- ์ฌ๊ท๋ก ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด ๋ง์ ์ค๋ณต ๊ณ์ฐ์ ํฌํจํ๋ค๋ฉด, ๋์ ๊ณํ๋ฒ์ผ๋ก ์ต์ ํ ๊ฐ๋ฅ
- ๋ฐฑํธ๋ํน ๋ฌธ์ ์ค ์ผ๋ถ๋ ๋์ ๊ณํ๋ฒ์ผ๋ก ๋ ํจ์จ์ ์ผ๋ก ํด๊ฒฐํ ์ ์์
๋ฐฑํธ๋ํน? ๋์ ๊ณํ๋ฒ?
๋๋ ์ด ๋์ด ํท๊ฐ๋ฆด๋๊ฐ ์๋ค... ์ค๋ง์ด๊น
๋ ๊ธฐ๋ฒ ๋ชจ๋ ๋ณต์กํ ๋ฌธ์ ๋ฅผ ๋ ์์ ๋ถ๋ถ ๋ฌธ์ ๋ก ๋๋์ด ํด๊ฒฐํ์ง๋ง, ์ ๊ทผ ๋ฐฉ์·์ฌ์ฉ ๋ชฉ์ ์ด ๋ค๋ฅด๋ค.
์ฃผ์ ์ฐจ์ด์
๋ฐฑํธ๋ํน | ๋์ ๊ณํ๋ฒ |
๋ชจ๋ ๊ฐ๋ฅํ ํด๋ฅผ ํ์ | "์ต์ ์ ํด'๋ฅผ ์ฐพ๋๋ฐ์ ์ค์ |
๊ฐ๋ฅํ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํ์ํ๋ฉฐ ํ์์๋ ๊ฒฝ์ฐ๋ฅผ ์ ๊ฑฐ | ๋ถ๋ถ ๋ฌธ์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ์ฌ ์ฌ์ฌ์ฉ |
์ฃผ๋ก ๊ฒฐ์ ๋ฌธ์ , ๋ชจ๋ ํด๋ฅผ ์ฐพ๋ ๋ฌธ์ ์ ์ฌ์ฉ | ์ฃผ๋ก ์ต์ ํ ๋ฌธ์ |
๋ํ ๋ฐฑํธ๋ํน์ ์ฃผ๋ก ์ฌ๊ท๋ก ๊ตฌํ๋๋ค. ๋ฌผ๋ก ์์ ๋ช ์ํ๋ค์ํผ ๋์ ๊ณํ๋ฒ๋ ์ฌ๊ท๋ก ๊ตฌํ๋๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ํ์ง๋ง ์ฌ๊ท๊ฐ ์ฌ์ฉ๋๋ ๋น๋๋ฅผ ๋ฐ์ ธ๋ณด๋ฉด ๋ฐฑํธ๋ํน >> ์ฌ๊ท์ธ ๋ฏ ์ถ๋ค.