[자료구조] 동적 계획법 - dp 2차원 배열로 좌표 이동하기 / Python 파이썬

2023. 2. 6. 11:36·python/자료구조 & 알고리즘
728x90
반응형

 

동적계획법 (다이나믹 프로그래밍)에 대해서 코딩 문제는 많이 푼 것 같지만 여러 유형의 dp 에 대해 다뤄보지 못한 것 같아 포스팅한다.

 

본 게시글은 해당 게시글의 내용 파이썬으로 변경하였다. 

 

예를 들어 정수들이 저장된 nXn의 좌상단에서 우 하단 까지 이동하는 문제에서 오른쪽이나 하단으로만 이동이 가능하다는 조건으로 지나간 값들의 합이 최소가 되도록 하는 최적의 경로를 찾아보자.

 

 

 

 

0,0에서 i,j 까지 가는 방법은 2가지가 있다.

 

 i, (j-1)를 거쳐서 오거나 (i-1), j 로 오는 방법이다.

이렇게 거쳐서 오는 값들을 수식으로 확인해보면 다음과 같다.

그럼 파이썬으로 프로그래밍 하자.

 

 

def mat(i,j):
    if i == 1 and j == 1:
        return m[i][j]; # 외길로 판단하여 하나의 경우만 적용하여 계산
    elif i == 1:
        return mat(1,j-1) + m[i][j] # 왼쪽으로 이동
    elif j == 1:
        return mat(i-1,1) + m[i][j]
    else:
        min(mat(i-1,j),mat(i,j-1)) + m[i][j]

이와 같은 알고리즘에서 슈도 코드는 위와 같다.

방금전에 본 순환식을 그대로 코드로 옮긴 것이다.

물론 이렇게 하면 올바로 계산이 되겠지만, 상당히 비효율적인 코드이다.

왜냐하면 값을 구하기 위해 중복되는 요소가 많이 발생하기 때문이다.

따라서 메모이제이션이나 bottom up 방식을 사용해서 보다 효율적인 코딩을 할 수 있다.

 

def mat(i,j):
    if L[i][j]!= 1:
        return L[i][j];
    if i == 1 and j == 1:
        L[i][j] = m[i][j]
    elif i == 1:
        L[i][j] = mat(1,j-1) + m[i][j]
    elif j == 1:
        L[i][j] = mat(i-1,1) + m[i][j]
    else:
        L[i][j] = min(mat(i-1,j),mat(i,j-1)) + m[i][j]
        return L[i][j]

메모이제이션을 활용하여 보다 개선된 코드가 만들어진다.

메모이제이션 기법에서 항상 사용하듯, 배열로 캐시를 만든다.

이렇게 만들어진 캐시는 -1로 초기화 되며, 조건문은 -1이 라면 캐싱이 안된 상태이므로 연산을 진행하고,

-1이 아니라 다른 값이 들어 있다면 연산 없이 기존에 배열에 저장된 값을 리턴하게 된다.

 

위의 비효율적인 코드와 비교해 보자면

기존의 코드는 저장 없이 리턴을 바로 하게되는 것이며, 메모이제이션은 캐시에 저장하여 리턴하므로

중복된 계산이 사라지며 깔끔하고 효율적으로 변한다는 것이다.

 

- 바텀업

기본적인 순환식 설계 후 dp를 for문으로 돌림

 

reference

https://new93helloworld.tistory.com/221

 

[알고리즘] 동적 계획법(Dynamic Programming) - 2

동적 계획법(Dynamic Programming) - 2 지난 시간에 이어서 기본적인 동적 계획법의 예를 알아보자위의 그림은 정수들이 저장된 nXn의 좌상단에서 우 하단 까지 이동하는 문제이다.단 이때, 오른쪽이나

new93helloworld.tistory.com

 

728x90
반응형

'python > 자료구조 & 알고리즘' 카테고리의 다른 글

[알고리즘] 이진탐색 (이분탐색) - 파라메틱 서치 / Python 파이썬  (0) 2023.02.09
[알고리즘] 플로이드 워샬 VS 다익스트라 차이점 - 최단 경로 알고리즘  (0) 2023.01.25
[알고리즘] 다익스트라 알고리즘  (0) 2023.01.20
[알고리즘] 미로 찾기 - BFS, DFS  (1) 2022.10.11
[Python] Re 모듈 re.split() 으로 문자열 패턴으로 분리하기  (0) 2022.10.02
'python/자료구조 & 알고리즘' 카테고리의 다른 글
  • [알고리즘] 이진탐색 (이분탐색) - 파라메틱 서치 / Python 파이썬
  • [알고리즘] 플로이드 워샬 VS 다익스트라 차이점 - 최단 경로 알고리즘
  • [알고리즘] 다익스트라 알고리즘
  • [알고리즘] 미로 찾기 - BFS, DFS
sillon
sillon
꾸준해지려고 합니다..
    반응형
  • sillon
    sillon coding
    sillon
  • 전체
    오늘
    어제
    • menu (613)
      • notice (2)
      • python (68)
        • 자료구조 & 알고리즘 (23)
        • 라이브러리 (19)
        • 기초 (8)
        • 자동화 (14)
        • 보안 (1)
      • coding test - python (301)
        • Programmers (166)
        • 백준 (76)
        • Code Tree (22)
        • 기본기 문제 (37)
      • coding test - C++ (5)
        • Programmers (4)
        • 백준 (1)
        • 기본기문제 (0)
      • 공부정리 (5)
        • 신호처리 시스템 (0)
        • Deep learnig & Machine lear.. (41)
        • Data Science (18)
        • Computer Vision (17)
        • NLP (40)
        • Dacon (2)
        • 모두를 위한 딥러닝 (강의 정리) (4)
        • 모두의 딥러닝 (교재 정리) (9)
        • 통계 (2)
      • HCI (23)
        • Haptics (7)
        • Graphics (11)
        • Arduino (4)
      • Project (21)
        • Web Project (1)
        • App Project (1)
        • Paper Project (1)
        • 캡스톤디자인2 (17)
        • etc (1)
      • OS (10)
        • Ubuntu (9)
        • Rasberry pi (1)
      • App & Web (9)
        • Android (7)
        • javascript (2)
      • C++ (5)
        • 기초 (5)
      • Cloud & SERVER (7)
        • Git (2)
        • Docker (0)
        • DB (4)
      • Paper (7)
        • NLP Paper review (6)
      • 데이터 분석 (0)
        • GIS (0)
      • daily (2)
        • 대학원 준비 (0)
      • 영어공부 (6)
        • job interview (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    programmers
    백준
    소수
    Python
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
sillon
[자료구조] 동적 계획법 - dp 2차원 배열로 좌표 이동하기 / Python 파이썬
상단으로

티스토리툴바