Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- #내일배움단 #코딩프로젝트 #국비지원 #내일배움카드 #스파르타코딩클럽
- 항해99솔직후기 #항해99 #부트캠프추천
- 부트스트랩 #Bootstrap #웹개발첫걸음 #스파르타코딩클럽
- 스파르타코딩클럽 #코딩 #jQuery #Ajax
- 스파르타코딩클럽 #크롤링 #스크래핑
Archives
- Today
- Total
이모저모
top-down, 재귀, 메모이제이션 본문
앞에서 풀었던 문제(네트워크 선 자르기)를 재귀로도 풀 수 있다!! 진짜 재미있다..!!ㅎㅎㅎ
이 접근 방식이 동적 계획법으로서의 빛을 발하는 부분은 "메모이제이션 memoization"이다.
동일한 계산을 반복하지 않도록, 이전에 계산한 값을 저장해두는 것으로, 이 문제에서는 불필요한 재귀의 호출을 방지해준다.
재귀를 열심히 연습하면서 종종 내가 너무 모든 경우를 다 돌고 있다는 느낌이 들고는 했는데,
이번에 이걸 배우고 나니 다른 재귀문제를 풀 때도 메모이제이션을 통해 엣지를 탁탁 컷해보고 싶다는 생각이 든다!ㅎㅎ
1. 손 정리
2. 코드로 써보기
n = 7
# 메모이제이션을 위한 공간! 이 리스트의 인덱스번호에 해당하는 길이를 몇 가지 방식으로 자를 수 있는지 구하면 거기에 값을 넣어두기.
# 또 다른 곳에서 같은 길이에 대한 재귀적 호출을 하지 않도록 하기 위함.
obtained = [0] * (n+1)
def DFS(length:int):
# 직관적으로 알 수 있어 미리 정해줄 수 있는 return 값들
if length == 2:
return 2
if length == 1:
return 1
else:
# 이게 이번에 중요하게 배운 포인트! 바로 메모이제이션!
# 이미 계산한 값이 존재한다면! 초기화해둔 값인 0 이 아닐 것이다.
# 그렇다면 재귀적 호출 필요 없이 거기서 바로 값을 가져온다.
if obtained[length] != 0:
return obtained[length]
else:
# 계산한 값이 없다면 하부로 내려가서 구한 값끼리 더해주어야 한다.
# 그리고 구함과 동시에 그 값을 obtained 에 넣어주어 나중에 같은 계산을 안 하도록 한다.
obtained[length] = DFS(length-1) + DFS(length-2)
return obtained[length]
print(DFS(n))
'coding > 알고리즘,자료구조' 카테고리의 다른 글
간단한 예제로 동적계획법 복습 (0) | 2022.01.29 |
---|---|
디스크 컨트롤러 - heap 문제 (프로그래머스) (0) | 2022.01.29 |
동적 계획법 (dynamic programming) _bottom up (네트워크 선 자르기 문제) (0) | 2022.01.28 |
퀵정렬(quick sort) - 전위순회방식의 DFS (0) | 2022.01.28 |
병합정렬 (merge-sort) _ 후위순회방식의 DFS (0) | 2022.01.28 |
Comments