대왕판다
ESTP 하고재비로 살아가기
대왕판다
전체 방문자
오늘
어제
  • 분류 전체보기
    • 일상
      • 먹고재비
      • 생각대로
    • 개발
      • html css
      • 자바
      • 자바스크립트
      • 파이썬
      • 알고리즘
      • 북TIL
      • 네트워크
      • 객체지향개발

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • css
  • 리액트
  • 노개북
  • 알고리즘
  • 챌린지
  • 자바
  • html
  • 맛집
  • 브루트포스
  • 양산맛집
  • 양산
  • 상길북
  • 자바스크립트
  • 마이바티스
  • 백준
  • 코딩
  • 노마드코더
  • 타입스크립트
  • 파이썬
  • 클론코딩

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
대왕판다

ESTP 하고재비로 살아가기

개발/북TIL

파이썬 알고리즘 인터뷰 23장 다이나믹 프로그래밍(DP)

2022. 11. 11. 18:21

오늘 TIL 3줄 요약

  • 최적 부분 구조 - 문제의 최적 해결방법이 부분 문제에 대한 최적 해결 방법으로 구성되는 경우의 문제
  • DP 알고리즘을 이용하면 최적 부분 구조를 갖고있는 문제를 풀이할 수 있다.
  • 최적 부분 구조를 푸는 또 다른 알고리즘으로는 그리디 알고리즘이 있다. 그리디는 그 순간에 최적이라 생각하는 것을 선택하며 풀이
  • DP는 중복된 하위 문제들의 결과를 저장해뒀다가 풀이해 나간다.
  • 중복되지 않은 문제들은 DP로 풀지 않고 병합정렬, 퀵 정렬 등을 이용해 분할정복으로 풀어나간다.
  • 다익스트라 알고리즘은 최적 부분 구조, 중복된 하위 문제들, 탐욕 선택 속성을 모두 갖는 알고리즘이다.

TIL (Today I Learned) 날짜

  • 2020 11. 12. FRI

오늘 읽은 범위

  • 파이썬 알고리즘 인터뷰 - 23장 다이나믹 프로그래밍

책에서 기억하고 싶은 내용을 써보세요.

  • DP의 방법론

    1. 메모이제이션, 하향식 접근 : 하위 문제에 대한 정답을 계산했는지 확인해가며 자연스럽게 재귀로 풀어나간다.

    2. 타뷸레이션, 상향식 접근 : 하위 문제부터 풀어나가며 큰 문제의 정답을 만든다.

    3. 두 방식을 피보나치 수열의 예제 코드로 비교하면 다음과 같다

      # 상향식
      def fib(n):
          dp[0] = 0
          dp[1] = 1
          for i in range(2, n+1):
              dp[i] = dp[i-1] + dp[i-2]
              return dp[n]
      # 하향식
      def fib(n):
          if n<=1:
              return n
          if dp[n]:
              return dp[n]
          dp[n] = fib(n-1) + fib(n-2)
          return dp[n]
      

  • DP 대표문제 2) 배낭문제의 파이썬 풀이

  • # pack 이라는 리스트 변수애 6 x 16 행렬 형태의 중간 결과 테이블이 생성된다.
    cargo = [
        # 가격, 무게
        (4, 12),
        (2, 1),
        (10, 4),
        (1, 1),
        (2, 2),
    ]
    
    
def zero_one_knapsack(cargo):
    # 배낭의 총 용량
    capacity = 15
    pack = []
    for i in range(len(cargo)+1):
        pack.append([])
    for c in range(capacity+1):
        if i == 0 or c == 0:
            pack[i].append(0)
        elif cargo[i-1][1] <= c:
            pack[i].append(
                max(
                    cargo[i-1][0] + pack[i-1][c-cargo[i-1][1]],
                    pack[[i-1][c]]
                ))
        else:
            pack[i].append(pack[i-1][c])

        return pack[-1][-1]
```

<p></p>
  • 원래 해시 테이블은 입력 순서가 유지되지 않는다. 파이썬 3.6 이하 버전에서는 딕셔너리 입력 순서가 유지되지 않는다. collections.OrderedDict 자료형을 이용해 이를 해결하자.

오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요

  • DP는 유난히 문제를 못풀었을때의 허탈함이 큰 것 같다. 문제 해결의 실마리(점화식)의 중요성이 유독 크게 느껴진다.

  • 그래도 PS 대회가 아니고서야 유형이 정해져있다는 사실이 위로가 된다.

'개발 > 북TIL' 카테고리의 다른 글

파이썬 알고리즘 인터뷰 9, 10, 11장 - 스택, 큐, 데크, 우선순위 큐, 해시 테이블  (0) 2022.11.07
[북TIL] 파이썬알고리즘인터뷰 6. 문자열 조작  (0) 2022.07.27
파이썬 알고리즘 인터뷰 5장 리스트, 딕셔너리  (0) 2022.07.20
[북TIL] 파이썬 알고리즘 인터뷰 1~3장  (0) 2022.07.14
[북TIL] 실용주의 프로그래머 4. 실용주의 편집증  (0) 2022.05.20
    '개발/북TIL' 카테고리의 다른 글
    • 파이썬 알고리즘 인터뷰 9, 10, 11장 - 스택, 큐, 데크, 우선순위 큐, 해시 테이블
    • [북TIL] 파이썬알고리즘인터뷰 6. 문자열 조작
    • 파이썬 알고리즘 인터뷰 5장 리스트, 딕셔너리
    • [북TIL] 파이썬 알고리즘 인터뷰 1~3장
    대왕판다
    대왕판다
    let's learn and roll!

    티스토리툴바