[1] ์ ๋ต ์ฝ๋
import sys
sys.setrecursionlimit(10**5)
input=sys.stdin.readline
M,N=map(int, input().split())
plan=[list(map(int, input().split())) for _ in range(M)]
route=[[-1]*N for _ in range(M)]
dx=[1,-1,0,0]
dy=[0,0,1,-1]
def dfs(start):
x,y=start
if x==M-1 and y==N-1: return 1
if route[x][y]!=-1: return route[x][y]
route[x][y]=0
for i in range(4):
nx=x+dx[i]
ny=y+dy[i]
if nx<0 or nx>=M or ny<0 or ny>=N: continue
if plan[nx][ny]<plan[x][y]: route[x][y]+=dfs([nx,ny])
return route[x][y]
dfs([0,0])
print(route[0][0])
1. import sys: sys ๋ชจ๋์ ์ํฌํธํ๋ค.
2. sys.setrecursionlimit(10**5): ์ฌ๊ท ํธ์ถ์ ์ต๋ ๊น์ด๋ฅผ ์ค์ ํ๋ค. ์ด๋ ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ์์ ์ฌ๊ท ํธ์ถ์ ๊น์ด ์ ํ์ ๋๋ ค์ค๋ค.
3. input=sys.stdin.readline: input ํจ์์ sys.stdin.readline์ ํ ๋นํ์ฌ ์ ๋ ฅ ์๋๋ฅผ ๋น ๋ฅด๊ฒ ๋ง๋ ๋ค.
4. M,N=map(int, input().split()): ์ฒซ ๋ฒ์งธ ์ค์์ M๊ณผ N์ ์ ๋ ฅ๋ฐ๋๋ค. M์ ํ์ ๊ฐ์, N์ ์ด์ ๊ฐ์๋ฅผ ์๋ฏธํ๋ค.
5. plan=[list(map(int, input().split())) for _ in range(M)]: ์ด์ด์ง๋ M๊ฐ์ ์ค์์ MxN ํฌ๊ธฐ์ ๋ฏธ๋ก ์ ๋ณด๋ฅผ ์ ๋ ฅ๋ฐ์ 2์ฐจ์ ๋ฆฌ์คํธ์ธ plan์ ์ ์ฅํ๋ค. plan[i][j]๋ (i, j) ์์น์ ๋์ด๋ฅผ ์๋ฏธํ๋ค.
- input().split(): input() ํจ์๋ฅผ ํธ์ถํ์ฌ ์ฌ์ฉ์๋ก๋ถํฐ ํ ์ค์ ์ ๋ ฅ์ ๋ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ split() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฆฌํ์ฌ ๋ฆฌ์คํธ๋ก ๋ง๋ ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํ ์ค์ ์ ๋ ฅ๋ ๊ฐ๋ค์ด ๋ฆฌ์คํธ์ ์์๋ก ๋ค์ด๊ฐ๊ฒ ๋๋ค.
- list(map(int, ...)): ๋ถ๋ฆฌ๋ ๊ฐ ์์๋ค์ ์ ์ํ์ผ๋ก ๋ณํํ๋ค. map() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ์์์ ๋ํด ์ ์ํ์ผ๋ก ๋ณํํ๋ ์์ ์ ํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฌธ์์ด ํํ์ ์ซ์๋ค์ด ์ ์ํ์ผ๋ก ๋ณํ๋์ด ๋ฆฌ์คํธ์ ๋ค์ด๊ฐ๊ฒ ๋๋ค.
- list(map(int, input().split())): ๊ฒฐ๊ตญ ํ ์ค์ ์ ๋ ฅ๋ ๋ฌธ์์ด์ ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฆฌํ์ฌ ์ ์ํ์ผ๋ก ๋ณํํ ๊ฐ์ ๋ฆฌ์คํธ๋ก ๋ง๋ ๋ค. ์ด ๊ณผ์ ์ M๋ฒ ๋ฐ๋ณตํ๋ฏ๋ก, M๊ฐ์ ๋ฆฌ์คํธ๊ฐ ์์ฑ๋๋ค.
- [... for _ in range(M)]: ๋ฆฌ์คํธ ์ปดํ๋ฆฌํจ์ ์ ์ฌ์ฉํ์ฌ M๊ฐ์ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๋ค. _ ๋ณ์๋ ๋ฐ๋ณต๋ฌธ์์ ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ ๋ฌด์ํ๊ณ ์ ํ ๋ ์ฌ์ฉ๋๋ ๊ด๋ก์ ์ธ ๋ณ์์ด๋ค. ์ฌ๊ธฐ์๋ _๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ๋ณต๋ฌธ์์ ์ฌ์ฉ๋๋ ๋ณ์๋ฅผ ๋ช ์์ ์ผ๋ก ๋ฌด์ํ๊ณ ์๋ค.
- plan=: ์์ฑ๋ ๋ฆฌ์คํธ๋ค์ plan ๋ณ์์ ํ ๋นํ์ฌ ์ ์ฅํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด MxN ํฌ๊ธฐ์ 2์ฐจ์ ๋ฆฌ์คํธ๊ฐ ๋ง๋ค์ด์ง๊ฒ ๋๋ค. ๊ฐ ์์์ธ plan[i][j]๋ (i, j) ์์น์ ๋์ด๋ฅผ ์๋ฏธํ๋ค.
6. route=[[-1]*N for _ in range(M)]: MxN ํฌ๊ธฐ์ 2์ฐจ์ ๋ฆฌ์คํธ route๋ฅผ ์์ฑํ๋ค. route[i][j]๋ ์ถ๋ฐ์ง(0, 0)์์ (i, j)๊น์ง์ ๊ฒฝ๋ก ์๋ฅผ ์ ์ฅํ๋ค. ์ด๊ธฐ๊ฐ์ -1๋ก ์ค์ ๋๋ค.
- [-1]*N: N๊ฐ์ -1๋ก ์ด๋ฃจ์ด์ง ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํ ํ์ ์ด๊ธฐ๊ฐ์ด ๋๋ค. ๋ง์ฝ N์ด 3์ด๋ผ๋ฉด [-1, -1, -1]์ด ๋๋ค.
- [...] for _ in range(M): ๋ฆฌ์คํธ ์ปดํ๋ฆฌํจ์ ์ ์ฌ์ฉํ์ฌ M๊ฐ์ ๋ฆฌ์คํธ๋ฅผ ์์ฑ๋๋ค. ๊ฐ ๋ฆฌ์คํธ๋ N๊ฐ์ -1๋ก ์ด๋ฃจ์ด์ง ํ์ด ๋๋ฉฐ, ์ ์ฒด์ ์ผ๋ก MxN ํฌ๊ธฐ์ 2์ฐจ์ ๋ฆฌ์คํธ๊ฐ ์์ฑ๋๋ค. _ ๋ณ์๋ ๋ฐ๋ณต๋ฌธ์์ ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ ๋ฌด์ํ๊ณ ์ ํ ๋ ์ฌ์ฉ๋๋ ๊ด๋ก์ ์ธ ๋ณ์์ด๋ค.
- route=: ์์ฑ๋ 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ route ๋ณ์์ ํ ๋นํ์ฌ ์ ์ฅํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ถ๋ฐ์ง(0, 0)์์ ๊ฐ ์์น (i, j)๊น์ง์ ๊ฒฝ๋ก ์๋ฅผ ์ ์ฅํ ์ ์๋ route ๋ฆฌ์คํธ๊ฐ ๋ง๋ค์ด์ง๊ฒ ๋๋ค. ์ด๊ธฐ๊ฐ์ผ๋ก๋ ๋ชจ๋ ์์น์ ๊ฒฝ๋ก ์๊ฐ -1๋ก ์ค์ ๋์ด ์๋ค.
7. dx=[1,-1,0,0], dy=[0,0,1,-1]: ์ํ์ข์ฐ๋ก ์ด๋ํ ๋์ x์ถ๊ณผ y์ถ ์ด๋ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ๋ค.
8. def dfs(start):: DFS ์๊ณ ๋ฆฌ์ฆ์ ์ ์ํ๋ค. start๋ ํ์ฌ ์์น๋ฅผ ๋ํ๋ด๋ ๋ฆฌ์คํธ [x, y]์ด๋ค.
9. x, y = start: ํ์ฌ ์์น๋ฅผ ๊ฐ์ ธ์จ๋ค.
10. if x==M-1 and y==N-1: return 1: ๋ง์ฝ ํ์ฌ ์์น๊ฐ ๋์ฐฉ์ง์ ์ธ ๊ฒฝ์ฐ 1์ ๋ฐํํ๊ณ ์ฌ๊ท๋ฅผ ์ข ๋ฃํ๋ค.
11. if route[x][y] != -1: return route[x][y]: ๋ง์ฝ ํ์ฌ ์์น๊น์ง์ ๊ฒฝ๋ก ์๊ฐ ์ด๋ฏธ ๊ณ์ฐ๋์ด ์์ผ๋ฉด ์ด๋ฅผ ๋ฐํํ๋ค.
12. route[x][y] = 0: ํ์ฌ ์์น๊น์ง์ ๊ฒฝ๋ก ์๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ๋ค.
13. for i in range(4):: ์ํ์ข์ฐ๋ก ์ด๋ํ๋ฉฐ ๊ฐ ๋ฐฉํฅ์ผ๋ก ํ์ํ๋ค.
14. nx = x + dx[i], ny = y + dy[i]: ๋ค์ ์ด๋ํ ์์น๋ฅผ ๊ณ์ฐํ๋ค.
15. if nx < 0 or nx >= M or ny < 0 or ny >= N: continue: ๋ฏธ๋ก ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ์๋ ํ์์ ์งํํ์ง ์๊ณ ๋ค์ ๋ฐฉํฅ์ผ๋ก ๋์ด๊ฐ๋ค.
16. if plan[nx][ny] < plan[x][y]: route[x][y] += dfs([nx, ny]): ํ์ฌ ์์น์ ๋์ด๋ณด๋ค ๋ฎ์ ์์น๋ก๋ง ์ด๋ํ ์ ์์ผ๋ฏ๋ก, ๋ค์ ์์น๊ฐ ํ์ฌ ์์น๋ณด๋ค ๋ฎ์ ๋์ด๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด ํด๋น ์์น๊น์ง์ ๊ฒฝ๋ก ์๋ฅผ ๊ณ์ฐํ์ฌ route[x][y]์ ๋ํด์ค๋ค.
17. return route[x][y]: ํ์ฌ ์์น๊น์ง์ ๊ฒฝ๋ก ์๋ฅผ ๋ฐํํ๋ค.
18. dfs([0,0]): ์ถ๋ฐ์ง(0, 0)์์ ์์ํ์ฌ DFS ์๊ณ ๋ฆฌ์ฆ์ ์คํํ๋ค.
19. print(route[0][0]): ์ถ๋ฐ์ง(0, 0)์์ ๋์ฐฉ์ง(M-1, N-1)๊น์ง์ ๊ฒฝ๋ก ์๋ฅผ ์ถ๋ ฅํ๋ค.
sys.setrecursionlimit()
ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ๊ท ํธ์ถ์ ๋ํ ์ต๋ ๊น์ด(์ฌ๊ท ์คํ์ ๊น์ด)๋ฅผ ์ ํํ๊ณ ์๋ค. ์ด๋ ๋๋ฌด ๋ง์ ์ฌ๊ท ํธ์ถ์ด ๋ฐ์ํ์ฌ ์คํ์ด ๋๋ฌด ๊น์ด์ง๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํ ๊ฒ์ด๋ค. ํ์ง๋ง ๋๋ก๋ ํน์ ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๊ธฐ๋ณธ ์ ํ์ ๋๋ ค์ผ ํ ๋๊ฐ ์๋ค.
sys.setrecursionlimit() ํจ์๋ ํ์ด์ฌ์์ ์ฌ๊ท ํธ์ถ์ ์ต๋ ๊น์ด๋ฅผ ์ค์ ํ๋ ํจ์์ด๋ค. ์ด ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๊ท ํธ์ถ์ ๊น์ด ์ ํ์ ๋๋ฆด ์ ์๋ค. ์ธ์๋ก๋ ์ ์๊ฐ์ ๋ฐ์ผ๋ฉฐ, ์ด ๊ฐ์ ์ฌ๊ท ํธ์ถ์ ์ต๋ ๊น์ด๋ฅผ ๋ํ๋ธ๋ค.
sys.setrecursionlimit(10**5)์ ์ฌ๊ท ํธ์ถ์ ์ต๋ ๊น์ด๋ฅผ 10์ 5์น, ์ฆ 100,000์ผ๋ก ์ค์ ํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ ๊น์ ์ฌ๊ท ํธ์ถ์ด ๊ฐ๋ฅํด์ง๋ฉฐ, ์ผ๋ถ ๋ณต์กํ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ ๋ ์ ์ฉํ๋ค.
๊ทธ๋ฌ๋ ์ฃผ์ํ ์ ์ ์ฌ๊ท ํธ์ถ์ ๊น์ด ์ ํ์ ๋๋ฌด ํฌ๊ฒ ๋๋ฆฌ๋ฉด ์คํ ์ค๋ฒํ๋ก์ฐ(Stack Overflow) ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฉฐ, ์ด๋ ํ๋ก๊ทธ๋จ์ ๋น์ ์์ ์ธ ์ข
๋ฃ๋ฅผ ์ ๋ฐํ ์ ์๋ค. ๋ฐ๋ผ์ ๊น์ด ์ ํ์ ๋ณ๊ฒฝํ ๋์๋ ์ ์คํ๊ฒ ๊ฒฐ์ ํด์ผ ํ๋ค.
์คํ ์ค๋ฒํ๋ก์ฐ(Stack Overflow)
์ํํธ์จ์ด์์ ์คํ ์ค๋ฒํ๋ก(์์ด: stack overflow)๋ ์คํ ํฌ์ธํฐ๊ฐ ์คํ์ ๊ฒฝ๊ณ๋ฅผ ๋์ด์ค ๋ ์ผ์ด๋๋ค. ํธ์ถ ์คํ์ ์ ํ๋ ์์ ์ฃผ์ ๊ณต๊ฐ์ ์ด๋ฃจ๋ฉฐ ๋๊ฐ ํ๋ก๊ทธ๋จ ์์ ์ ๊ฒฐ์ ๋๋ค.
ํ๋ก๊ทธ๋จ์ด ํธ์ถ ์คํ์์ ์ด์ฉ ๊ฐ๋ฅํ ๊ณต๊ฐ ์ด์์ ์ฌ์ฉํ๋ ค๊ณ ์๋ํ ๋ ๋๋ ์ง์ ๋ ์์คํ
๋ฉ๋ชจ๋ฆฌ ์ฌ์ด์ฆ๋ณด๋ค ๊ณผ๋คํ ์คํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋ ์คํ ์ค๋ฒํ๋ก(overflow)๊ฐ ๋ฐ์ํ๋ฉฐ ์ด ๊ฒฝ์ฐ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ ์ ์ค ๋ฑ '์๋ฌ ๋ฐ์'์ด ์๋ฐ๋๋ค.
input=sys.stdin.readline
ํจ์๋ฅผ ๋ณ์์ ํ ๋นํ์ฌ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ ์๋ ์๋ค. ๋ํ, ํจ์๋ฅผ ๋ค๋ฅธ ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ์ฌ ์ฝ๋ฐฑ(callback) ํจ์๋ก ํ์ฉํ ์๋ ์๋ค.
[2] ํ์ํ ๋ฐฐ๊ฒฝ ์ง์
์ด ๋ฌธ์ ๋ DP(Dynamic Programming)๋ฅผ ์ฌ์ฉํ์ฌ DFS(Depth-First Search) ๋ฌธ์ ๋ฅผ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํ์ด์ผ ํ๋ค.
1. DP(Dynamic Programming)๋?
๋ณต์กํ ๋ฌธ์ ๋ฅผ ๊ฐ๋จํ ์ฌ๋ฌ ๊ฐ์ ๋ฌธ์ ๋ก ๋๋์ด ํธ๋ ๋ฐฉ๋ฒ์ ๋งํ๋ค.
๋ถํ ์ ๋ณต(Divide and Conquer)๊ณผ ์ ์ฌํ๋ฉฐ, ๋ถํ ์ ๋ณต๊ณผ์ ์ฐจ์ด์ ์ ๋์ ํ๋ก๊ทธ๋๋ฐ์ ์ค๋ณต๋๋ ๋ถ๋ถ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๋, ๊ทธ๊ฒ์ ํ ๋ฒ๋ง ๊ณ์ฐํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ (Memoization)ํ์ฌ ๋ค๋ฅธ ๋น์ทํ ๋ถ๋ถ ๋ฌธ์ ๋ค์ด ๋ค์ ๋ฐ์ํ ๋, ๋ฉ๋ชจ์ด์ ์ด์ ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ ์ฌํ์ฉํ๋ค๋ ๊ฒ์ด๋ค.
๋์ ํ๋ก๊ทธ๋๋ฐ์ ์ ์ฉํ๊ธฐ ์ํด์๋ ๋ค์์ ๋ ๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค.
- ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ(Optimal Substructure): ์ ์ฒด ๋ฌธ์ ์ ์ต์ ํด๊ฐ ๋ถ๋ถ ๋ฌธ์ ์ ์ต์ ํด๋ก๋ถํฐ ๊ตฌํด์ง ์ ์์ด์ผ ํ๋ค. Fibonacci ์์ด์ ๊ฒฝ์ฐ ์ฒซ๋ฒ์งธ ๋๋ฒ์งธ ์์ด์ ๊ฐ๊ฐ 1๋ก ๊ณ ์ ๋์ด ์๋ค. (ํธ์์ 0๋ฒ์งธ ํญ์ด 0์ด ๋๋ ๊ฒฝ์ฐ๋ ์๋ค.) ์ฆ, 3๋ฒ์งธ ์์ด์ ์ธ์ ๋ ๊ฒฐ๊ณผ๊ฐ 2์ด๋ค. ๋ 4๋ฒ์งธ ์์ด์ 3๋ฒ์งธ ์์ด๊ณผ 2๋ฒ์งธ ์์ด์ ์ด์ฉํด ๊ตฌํ๋ฏ๋ก ์ธ์ ๋ ์ ๋ต์ด ๊ฐ๋ค๋ ์ฌ์ค์ ์ ์ ์๋ค.
- ์ค๋ณต๋๋ ๋ถ๋ถ ๋ฌธ์ (Overlapping Subproblems): F(5)๋ฅผ ๊ตฌํ๊ธฐ ์ํด์๋ F(4), F(3)์ด ํ์ํ๋ค. ๋ค์ F(4)๋ฅผ ๊ตฌํ๊ธฐ ์ํด์๋ F(3),F(2)๊ฐ ํ์ํ๋ค. ์ด ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด๋ฉด F(5)์์๋ F(3)์ด ํ์ํ๊ณ F(4)์์๋ F(3)์ด ํ์ํจ์ ์ ์ ์๋ค. ์ฆ, ๋ถ๋ถ ๋ฌธ์ ๊ฐ ์ค๋ณต๋์ด ์ฌ๋ฌ๋ฒ ๋ฐ๋ณต ๊ณ์ฐ๋์ด์ผ ํ๋ค.
2. ๋ฉ๋ชจ์ด์ ์ด์ (Memoization)
๋ฉ๋ชจ์ด์ ์ด์
(memoization)์ ๋์ ํ๋ก๊ทธ๋๋ฐ(Dynamic Programming) ๊ธฐ๋ฒ ์ค ํ๋๋ก, ํจ์์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ์ฌ ์ดํ ๊ฐ์ ์
๋ ฅ์ด ๋ค์ด์ฌ ๋ ๋ค์ ๊ณ์ฐํ์ง ์๊ณ ์ ์ฅ๋ ๊ฐ์ ๋ถ๋ฌ์์ ์ฌํ์ฉํ๋ ์ต์ ํ ๊ธฐ๋ฒ์ด๋ค.
๋ฉ๋ชจ์ด์ ์ด์
์ ํจ์์ ๊ฒฐ๊ณผ ๊ฐ์ ์ ์ฅํ๋ ์บ์(Cache)๋ฅผ ์ด์ฉํ์ฌ ๋์ํ๋ค. ํจ์๋ฅผ ํธ์ถํ ๋๋ง๋ค ์
๋ ฅ ๊ฐ์ ๋ํ ๊ฒฐ๊ณผ ๊ฐ์ ์บ์์ ์ ์ฅํ๋ค. ์ดํ ๊ฐ์ ์
๋ ฅ์ด ๋ค์ด์ฌ ๋๋ ํจ์๋ฅผ ์คํํ์ง ์๊ณ ์ ์ฅ๋ ๊ฐ์ ๋ฐ๋ก ๋ฐํํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํจ์๋ฅผ ๋ฐ๋ณตํด์ ํธ์ถํ ๋๋ง๋ค ๊ณ์ฐํ๋ ์๊ฐ์ ์ ์ฝํ ์ ์์ผ๋ฉฐ, ํจ์์ ์คํ ์๋๋ฅผ ๋ํญ ํฅ์์ํฌ ์ ์๋ค.
๋ฉ๋ชจ์ด์ ์ด์
์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด์ด ํ์ํ๋ค.
- ๋ฌธ์ ๋ ๋ถ๋ถ ๋ฌธ์ ๋ก ๋๋ ์ ์์ด์ผ ํ๋ค.
- ๋ถ๋ถ ๋ฌธ์ ๋ ์ค๋ณต๋์ด์ผ ํ๋ค.
- ๋ถ๋ถ ๋ฌธ์ ์ ํด๊ฒฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ณ ์ฌ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ค.
๋ฉ๋ชจ์ด์ ์ด์
์ ๋๋ถ๋ถ์ ๋์ ํ๋ก๊ทธ๋๋ฐ ๋ฌธ์ ์์ ์ฌ์ฉ๋๋ฉฐ, ์ฌ๊ท ํจ์๋ฅผ ์ด์ฉํ Top-Down ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
ํ์ง๋ง Bottom-Up ๋ฐฉ์์ผ๋ก๋ ๊ตฌํํ ์ ์์ผ๋ฉฐ, ์ด ๊ฒฝ์ฐ์๋ ๋ถ๋ถ ๋ฌธ์ ์ ํด๊ฒฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์ด ๋๋ ๋ฆฌ์คํธ์ ์ ์ฅํ์ฌ ์ฌํ์ฉํ๋ค.
์ถ์ฒ:
https://galid1.tistory.com/507
3. ๋์ ํ๋ก๊ทธ๋๋ฐ์ ๊ตฌํ ๋ฐฉ๋ฒ
โฐTop-Down
Top-Down์ ๋ถํ ์ ๋ณต๊ณผ ๋น์ทํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์ ์ฒด ๋ฌธ์ ๋ฅผ ์์ ๋ถ๋ถ ๋ฌธ์ ๋ก ๋๋๊ณ , ๊ทธ ๋ถ๋ถ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ๊ท์ ์ผ๋ก ๋์ํ๋ค. ์ด ๋, ์ค๋ณต๋๋ ๋ถ๋ถ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฉ๋ชจ์ด์ ์ด์
(Memoization)์ด๋ผ๋ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ค. ์ด๋ ๋ถ๋ถ ๋ฌธ์ ์ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ์ฌ ์ฌํ์ฉํ๋ ๊ฒ์ ๋งํ๋ค.
Top-Down ๋ฐฉ์์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ๊ทํจ์๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํ๋ค. ๋ฐ๋ผ์ ์ฝ๋์ ๊ฐ๋
์ฑ์ด ๋์์ง์ง๋ง, ๋ง์ ์คํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๋ฉ๋ชจ์ด์ ์ด์
์ ์ฒ๋ฆฌ ์ค๋ฒํค๋๊ฐ ์กด์ฌํ ์ ์๋ค.
โฐBottom-Up
Bottom-Up์ ์ฌ๊ท์ ์ธ ํธ์ถ ์์ด, ์์ ๋ถ๋ถ ๋ฌธ์ ๋ค์ ๋จผ์ ํด๊ฒฐํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ด์ฉํด ์ ์ฒด ๋ฌธ์ ์ ์ต์ ํด๋ฅผ ๊ตฌํ๋ ๋ฐฉ์์ด๋ค. ์ด ๋, ์ด์ ์ ๊ณ์ฐํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์ด ๋๋ ๋ฆฌ์คํธ ๋ฑ์ ์๋ฃ๊ตฌ์กฐ์ ์ ์ฅํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ด์ฉํด ๋ค์ ๊ณ์ฐ์ ์ํํ๋ค.
Bottom-Up ๋ฐฉ์์ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ๋ณต๋ฌธ์ ์ด์ฉํ์ฌ ๊ตฌํํ๋ค. ๋ฐ๋ผ์ ์ฝ๋์ ๊ฐ๋
์ฑ์ ๋ฎ์์ง ์ ์์ง๋ง, ๋ง์ ๋ฐ๋ณต๋ฌธ์ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ ์คํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์์ ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ ํจ๊ณผ๊ฐ ์์ผ๋ฉฐ, ๋ฉ๋ชจ์ด์ ์ด์
์ ์ฒ๋ฆฌ ์ค๋ฒํค๋๊ฐ ์๋ค.
4. DFS(Depth-First Search)๋?
ํธ๋ฆฌ๋ ๊ทธ๋ํ๋ฅผ ํ์ํ๋ ๊ธฐ๋ฒ ์ค ํ๋๋ก, ์์ ๋
ธ๋์์ ์์์ ๋
ธ๋๋ค์ ์์๋๋ก ํ์ํ๋ฉด์ ๊น์ด๋ฅผ ์ฐ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
DFS๋ ์ฃผ๋ก ๋ฐ๋ณต๋ฌธ์ ํ์ฉํ๊ฑฐ๋, ์ฌ๊ท๋ฌธ์ ํตํ์ฌ ๊ตฌํ๋๋ค.
ํ์ ๊ณผ์ ์ด ์์ ๋
ธ๋์์ ํ์์ด ๊น์ด ์งํ๋๋ ๊ฒ์ ๋ง๊ธฐ ์ํด ๊น์ด ์ ํ(depth bound)์ ์ฌ์ฉํ๋ค. ๊น์ด ์ ํ์ ๋๋ฌํ ๋๊น์ง ๋ชฉํ๋
ธ๋๊ฐ ๋ฐ๊ฒฌ๋์ง ์์ผ๋ฉด ์ต๊ทผ์ ์ฒจ๊ฐ๋ ๋
ธ๋์ ๋ถ๋ชจ๋
ธ๋๋ก ๋๋์์์, ๋ถ๋ชจ๋
ธ๋์ ์ด์ ๊ณผ๋ ๋ค๋ฅธ ๋์์๋ฅผ ์ ์ฉํ์ฌ ์๋ก์ด ์์๋
ธ๋๋ฅผ ์์ฑํ๋ค.
์ฌ๊ธฐ์ ๋ถ๋ชจ๋
ธ๋๋ก ๋๋์์ค๋ ๊ณผ์ ์ ๋ฐฑํธ๋ํน(backtracking)์ด๋ผ ํ๋ค.
DFS์ ๊ธฐ๋ณธ ํ์ ๊ณผ์ ์ ํน์ ์ ์ ์์ ์์ํ์ฌ ์ญ์ถ์ (backtracking) ํ๊ธฐ ์ ์ ๊ฐ ๋ถ๊ธฐ๋ฅผ ๋ฐ๋ผ ๊ฐ๋ฅํ ํ ๋ฉ๋ฆฌ ํ์ํ๋ ๊ฒ์ด๋ค.
ํ์ํ๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
1. ํ์ฌ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ๊ฒ์ผ๋ก ํ์ํ๋ค.
2. ๋ฐฉ๋ฌธํ ํ์๊ฐ ๋์ด ์์ง ์์ ๊ฐ๊ฐ์ ์ธ์ ํ ์ ์ ์ ํ์ํ๋ค.
3. ๋ ์ด์ ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ์ด ์์ผ๋ฉด ์ด์ ์ ์ ์ผ๋ก ์ญ์ถ์ (backtracking) ํ๋ค.
4. ๋ชจ๋ ์ ์ ์ ๋ฐฉ๋ฌธํ ๋๊น์ง ํ๋ก์ธ์ค๋ฅผ ๋ฐ๋ณตํ๋ค.
์ฅ์
- ๋จ์ง ํ ๊ฒฝ๋ก์์ ๋ ธ๋๋ค๋ง์ ๊ธฐ์ตํ๋ฉด ๋๋ฏ๋ก ์ ์ฅ๊ณต๊ฐ์ ์์๊ฐ ๋น๊ต์ ์ ๋ค.
- ๋ชฉํ๋ ธ๋๊ฐ ๊น์ ๋จ๊ณ์ ์์ ๊ฒฝ์ฐ ํด๋ฅผ ๋นจ๋ฆฌ ๊ตฌํ ์ ์๋ค.
๋จ์
- ํด๊ฐ ์๋ ๊ฒฝ๋ก์ ๊น์ด ๋น ์ง ๊ฐ๋ฅ์ฑ์ด ์๋ค. ๋ฐ๋ผ์ ์ค์ ์ ๊ฒฝ์ฐ ๋ฏธ๋ฆฌ ์ง์ ํ ์์์ ๊น์ด๊น์ง๋ง ํ์ํ๊ณ ๋ชฉํ๋ ธ๋๋ฅผ ๋ฐ๊ฒฌํ์ง ๋ชปํ๋ฉด ๋ค์์ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ํ์ํ๋ ๋ฐฉ๋ฒ์ด ์ ์ฉํ ์ ์๋ค.
- ์ป์ด์ง ํด๊ฐ ์ต๋จ ๊ฒฝ๋ก๊ฐ ๋๋ค๋ ๋ณด์ฅ์ด ์๋ค. ์ด๋ ๋ชฉํ์ ์ด๋ฅด๋ ๊ฒฝ๋ก๊ฐ ๋ค์์ธ ๋ฌธ์ ์ ๋ํด ๊น์ด์ฐ์ ํ์์ ํด์ ๋ค๋ค๋ฅด๋ฉด ํ์์ ๋๋ด๋ฒ๋ฆฌ๋ฏ๋ก, ์ด๋ ์ป์ด์ง ํด๋ ์ต์ ์ด ์๋ ์ ์๋ค๋ ์๋ฏธ์ด๋ค.
์ถ์ฒ:
https://olrlobt.tistory.com/35
, ๋๋ฌด์ํค
[3] ๋๋ ์
DP์ DFS ๊ฐ๋ ์ ๋ํด ์ ์ ์์๋ค.
๊ทธ๋ฐ๋ฐ ์ด ๊ฐ๋ ์ ํ์ฉํ์ฌ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ง์ด ์ด๋ ค์ด ๊ฒ ๊ฐ๋ค!
๊ด๋ จ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๋ฉฐ ์ฐ์ต์ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
'SWLUG > ๋ฐฑ์ค BEAKJOON' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BAEKJOON/๋ฐฑ์ค] 2775๋ฒ: ๋ถ๋ ํ์ฅ์ด ๋ ํ ์ผ (0) | 2024.05.01 |
---|---|
[BAEKJOON/๋ฐฑ์ค] 9095๋ฒ: 1, 2, 3 ๋ํ๊ธฐ (0) | 2024.05.01 |
[BEAKJOON/ ๋ฐฑ์ค] 2629๋ฒ: ์ํ์ ์ธ (Python) (0) | 2024.04.02 |
[C] ๋ฐฑ์ค/BAEKJOON 2839๋ฒ: ์คํ ๋ฐฐ๋ฌ (1) | 2023.11.21 |
[C] ๋ฐฑ์ค/BAEKJOON 2566๋ฒ: ์ต๋๊ฐ (0) | 2023.11.15 |