SlideShare a Scribd company logo
1 of 17
Download to read offline
By POSTECH Computer Algorithm Team
동적 계획법1(DP1)
김범수
Dynamic Programming 1
Contents
POSTECH Computer Algorithm Team
2xN tiling 07
동적 계획법 03
LIS 11
예시 문제 17
POSTECH Computer Algorithm Team
동적 계획법은 큰 문제를 작은 문제로 나눠서 푸는 알고리즘이다. 방식은 분할 정복과 유사해 보이지만, 근본적인
차이점은 동적 계획법에서는 분할정복과 달리 한 번 계산한 부분문제를 여러 번 활용한다는 점이다.
복습을 위해 TOP-DOWN 방식과 BOTTOM-UP 형식에 대하여 다시 한 번 알아보자.
피보나치 수열을 구하는 함수를 예로 들면
동적 계획법
TOP-DOWN BOTTOM-UP
POSTECH Computer Algorithm Team
이와 같이 TOP-DOWN방식은 재귀함수를 사용하여 보다 직관적으로 구현할 수 있고, 순서 관계를 고려할 필요가 없
다. 그러나 시간이 느리다는 단점이 있다. BOTTOM-UP방식은 for문을 사용하여 보다 프로그램의 속도가 빨라지지만,
구현이 덜 직관적이고, 순서 관계를 고려해야 한다는 단점이 있다.
TOP-DOWN방식의 경우, 한 번 계산한 결과를 다시 계산하지 않게 하기 위해 memoization을 사용한다.
동적 계획법
BEFORE AFTER
POSTECH Computer Algorithm Team
동적 계획법을 사용하기 위해서는 다음과 같은 조건을 만족해야 한다.
F(x)에 대하여 동적 계획법을 사용할 때, F(a) = x, F(b) = y일 때 a == b이면, x ==y 를 만족해야 한다.
즉, 같은 입력값에 대해서는 항상 같은 출력값을 얻어야 한다.
예를 들어 피보나치 수열과 같은 경우에는 n번째 피보나치 수열의 값은 1가지로 일정하므로, 동적 계획법을 적용할
수 있지만, 한 점 s로부터 a까지의 경로를 출력하는 함수, F(a)가 있을 때, 하나의 a에 대하여 경로가 여러가지가
존재할 수 있으므로 동적 계획법을 적용할 수 없다.
동적 계획법
POSTECH Computer Algorithm Team
동적 계획법 문제 해결 방법(가이드라인)
1. 변수를 몇 차원으로 할 것인가?(변수의 개수)
2. 각 변수의 의미는 무엇인가?
3. 변수로 인해 도출되는 DP값은 어떤 의미인가?
4. DP값 간의 관계(점화식)은 무엇인가?
5. 점화식을 이용하여 for문 또는 재귀함수로 구현한다.
이제 문제들을 풀어보며 간단한 감을 익혀보자.
동적 계획법
POSTECH Computer Algorithm Team
2xN Tiling(11276)
POSTECH Computer Algorithm Team
Naive한 방법을 사용하면 직접 타일들을 배치하면서 경우의 수를 셀 수 있다. 당연하게도 이 방법은 무리가 있다.
그럼 먼저 타일 배치에 대한 특징을 알아보자.
만약 오른쪽과 같이 두 타일을 어긋나게 배치해보자.
그렇다면, 나머지 타일들은 어떻게 배치하더라도 빈 공간이 생기게 되어
2xN의 직사각형을 모두 채울 수 없음을 알 수 있다.
따라서 아래의 두 종류로만 타일을 배치할 수 있음을 알 수 있다.
2xN Tiling
POSTECH Computer Algorithm Team
그렇다면 동적 계획법을 어떻게 적용해야 할까?
여기서는 F(A)=B를 다음과 같이 정의할 것이다. -> B는 2xA 모양 직사각형을 채우는 경우의 수
그렇다면 점화식을 어떻게 세울 수 있을까?
위 그림과 같이 2xA의 직사각형을 채우기 위해서는 2x(A-2)의 직사각형에 가로 타일 2개 또는 2x(A-1)의 직사각형에
세로 타일 1개를 놓아서 채울 수 있다.
2xN Tiling
2x(A-2)
2x(A-1)
POSTECH Computer Algorithm Team
그렇다면 2xA 직사각형을 채우는 경우의 수는 2x(A-2) 직사각형을
채우는 경우의 수와 2x(A-1) 직사각형을 채우는 경우의 수의 합임을
알 수 있다. 즉, F(A) = F(A-1) + F(A-2)의 점화식이 성립함을 알
수 있다. F(0) = 0, F(1) = 1임은 당연하므로, 이를 이용하면 O(n)
안에 계산을 할 수 있다. 분할 정복과 행렬을 사용하여 O(logn)만에
구하는 방법도 있으니 관심있으면 찾아보자.
2xN Tiling
POSTECH Computer Algorithm Team
LIS(Longest Increasing Subsequence)는 한 수열에서 앞에서부터 뒤로 숫자를 하나씩 선택하여 부분 수열을 구성해
나갈 때 증가하는 순서대로 숫자를 고르면서 고른 부분 수열의 길이가 최대 길이가 되도록 숫자를 선택하는 경우이
다. 예시를 들어 다음과 같은 배열이 있을 때 이 배열의 LIS는
아래와 같이 색칠된 부분이 된다.
LIS(최장 증가 수열)
POSTECH Computer Algorithm Team
원래 LIS는 O(nlogn)으로 구현할 수 있지만, DP의 원리를 알아보기 위해 O(n^2)의 방법을 사용하자. 또한 이 방법은
오늘의 문제 JLIS에서 응용되어 사용되므로 방법을 익혀보자.
가장 직관적인 방법은 모든 부분 수열을 생성한 다음에 그 수열이 증가 수열인지를 검사하고, 증가 수열인 것 중에
서 최대의 길이를 가진 것이 LIS임을 알 수 있다. 물론 이 때는 O(n*2^n)이므로 시간 초과가 일어나게 된다.
그렇다면 동적 계획법을 어떻게 이용해야 할까?
LIS(최장 증가 수열)
POSTECH Computer Algorithm Team
먼저 F(A) = B를 다음과 같이 정의하자. -> A번째 숫자를 첫 번째 숫자로 가지는 LIS의 길이 B
그렇다면, F(N) = 1임은 당연하고(한 글자 이므로), F(A)를 구하는 방법을 생각해보자.
그렇다면 다음과 같이 생각할 수 있다.
LIS(최장 증가 수열)
Cache[i]
i 0 1 2 3 4 5 6
7 8
0 0 0 0 0 0 0
0 1
POSTECH Computer Algorithm Team
LIS(최장 증가 수열)
Cache[i]
i 0 1 2 3 4 5 6
7 8
0 0 0 0 0 0 0
2 1
Cache[i]
i 0 1 2 3 4 5 6
7 8
0 0 0 0 0 0 3
2 1
POSTECH Computer Algorithm Team
LIS(최장 증가 수열)
Cache[i]
i 0 1 2 3 4 5 6
7 8
0 0 0 0 0 3 3
2 1
Cache[i]
i 0 1 2 3 4 5 6
7 8
0 0 0 0 4 3 3
2 1
POSTECH Computer Algorithm Team
이와 같은 방법을 반복하면, LIS의 길이를 구할 수 있음을 알 수 있다. 만약 LIS의 길이가 아닌 LIS 자체를 구하고
싶다면, back 배열을 추가로 만들어서 cache가 갱신되도록 한 위치를 저장하면, LIS를 구할 수 있다. 후에 배울 이
진 탐색을 활용하면 O(nlogn)의 속도로 구현할 수 있다.
LIS(최장 증가 수열)
Cache[i]
i 0 1 2 3 4 5 6
7 8
6 5 4 4 4 3 3
2 1
POSTECH Computer Algorithm Team
https://algospot.com/judge/problem/read/ASYMTILING
https://algospot.com/judge/problem/read/PI
https://algospot.com/judge/problem/read/QUANTIZE
https://algospot.com/judge/problem/read/WILDCARD
https://algospot.com/judge/problem/read/JLIS
예시 문제

More Related Content

Similar to Dp 1

Project#2말의여행 Hwp
Project#2말의여행 HwpProject#2말의여행 Hwp
Project#2말의여행 HwpKimjeongmoo
 
1.자료구조와 알고리즘(강의자료)
1.자료구조와 알고리즘(강의자료)1.자료구조와 알고리즘(강의자료)
1.자료구조와 알고리즘(강의자료)fmbvbfhs
 
자료구조2보고서
자료구조2보고서자료구조2보고서
자료구조2보고서KimChangHoen
 
Computational Complexity
Computational ComplexityComputational Complexity
Computational Complexityskku_npc
 
랩탑으로 tensorflow 도전하기 - tutorial
랩탑으로 tensorflow 도전하기 - tutorial랩탑으로 tensorflow 도전하기 - tutorial
랩탑으로 tensorflow 도전하기 - tutorialLee Seungeun
 
DP Optimization
DP OptimizationDP Optimization
DP Optimization승혁 조
 
03. segment tree
03. segment tree03. segment tree
03. segment tree승혁 조
 
자료구조1보고서
자료구조1보고서자료구조1보고서
자료구조1보고서KimChangHoen
 
자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기라한사 아
 
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)HYUNJEONG KIM
 
Amugona study 1회 jjw
Amugona study 1회 jjwAmugona study 1회 jjw
Amugona study 1회 jjw정완 전
 
Amugona study 1회 jjw
Amugona study 1회 jjwAmugona study 1회 jjw
Amugona study 1회 jjw정완 전
 
자료구조 Project2
자료구조 Project2자료구조 Project2
자료구조 Project2KoChungWook
 
코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.
코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.
코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.ultrasuperrok
 
코딩테스트 합격자 되기 C++ 03장(시간 복잡도)를 설명한 ppt입니다
코딩테스트 합격자 되기 C++ 03장(시간 복잡도)를 설명한 ppt입니다코딩테스트 합격자 되기 C++ 03장(시간 복잡도)를 설명한 ppt입니다
코딩테스트 합격자 되기 C++ 03장(시간 복잡도)를 설명한 ppt입니다ultrasuperrok
 
[NDC 2018] 테라 콘솔 포팅기 - 현세대 콘솔 이식을 위한 렌더링 최적화 여정
[NDC 2018] 테라 콘솔 포팅기 - 현세대 콘솔 이식을 위한 렌더링 최적화 여정[NDC 2018] 테라 콘솔 포팅기 - 현세대 콘솔 이식을 위한 렌더링 최적화 여정
[NDC 2018] 테라 콘솔 포팅기 - 현세대 콘솔 이식을 위한 렌더링 최적화 여정SangHyeok Hong
 
01. c and time complexity
01. c and time complexity01. c and time complexity
01. c and time complexity승혁 조
 

Similar to Dp 1 (20)

Project#2말의여행 Hwp
Project#2말의여행 HwpProject#2말의여행 Hwp
Project#2말의여행 Hwp
 
1.자료구조와 알고리즘(강의자료)
1.자료구조와 알고리즘(강의자료)1.자료구조와 알고리즘(강의자료)
1.자료구조와 알고리즘(강의자료)
 
자료구조2보고서
자료구조2보고서자료구조2보고서
자료구조2보고서
 
DP 중급 2
DP 중급 2DP 중급 2
DP 중급 2
 
01. dp hard
01. dp hard01. dp hard
01. dp hard
 
Computational Complexity
Computational ComplexityComputational Complexity
Computational Complexity
 
랩탑으로 tensorflow 도전하기 - tutorial
랩탑으로 tensorflow 도전하기 - tutorial랩탑으로 tensorflow 도전하기 - tutorial
랩탑으로 tensorflow 도전하기 - tutorial
 
DP Optimization
DP OptimizationDP Optimization
DP Optimization
 
03. segment tree
03. segment tree03. segment tree
03. segment tree
 
자료구조1보고서
자료구조1보고서자료구조1보고서
자료구조1보고서
 
자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기
 
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
 
Amugona study 1회 jjw
Amugona study 1회 jjwAmugona study 1회 jjw
Amugona study 1회 jjw
 
Amugona study 1회 jjw
Amugona study 1회 jjwAmugona study 1회 jjw
Amugona study 1회 jjw
 
자료구조 Project2
자료구조 Project2자료구조 Project2
자료구조 Project2
 
코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.
코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.
코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.
 
코딩테스트 합격자 되기 C++ 03장(시간 복잡도)를 설명한 ppt입니다
코딩테스트 합격자 되기 C++ 03장(시간 복잡도)를 설명한 ppt입니다코딩테스트 합격자 되기 C++ 03장(시간 복잡도)를 설명한 ppt입니다
코딩테스트 합격자 되기 C++ 03장(시간 복잡도)를 설명한 ppt입니다
 
자구2번
자구2번자구2번
자구2번
 
[NDC 2018] 테라 콘솔 포팅기 - 현세대 콘솔 이식을 위한 렌더링 최적화 여정
[NDC 2018] 테라 콘솔 포팅기 - 현세대 콘솔 이식을 위한 렌더링 최적화 여정[NDC 2018] 테라 콘솔 포팅기 - 현세대 콘솔 이식을 위한 렌더링 최적화 여정
[NDC 2018] 테라 콘솔 포팅기 - 현세대 콘솔 이식을 위한 렌더링 최적화 여정
 
01. c and time complexity
01. c and time complexity01. c and time complexity
01. c and time complexity
 

Dp 1

  • 1. By POSTECH Computer Algorithm Team 동적 계획법1(DP1) 김범수 Dynamic Programming 1
  • 2. Contents POSTECH Computer Algorithm Team 2xN tiling 07 동적 계획법 03 LIS 11 예시 문제 17
  • 3. POSTECH Computer Algorithm Team 동적 계획법은 큰 문제를 작은 문제로 나눠서 푸는 알고리즘이다. 방식은 분할 정복과 유사해 보이지만, 근본적인 차이점은 동적 계획법에서는 분할정복과 달리 한 번 계산한 부분문제를 여러 번 활용한다는 점이다. 복습을 위해 TOP-DOWN 방식과 BOTTOM-UP 형식에 대하여 다시 한 번 알아보자. 피보나치 수열을 구하는 함수를 예로 들면 동적 계획법 TOP-DOWN BOTTOM-UP
  • 4. POSTECH Computer Algorithm Team 이와 같이 TOP-DOWN방식은 재귀함수를 사용하여 보다 직관적으로 구현할 수 있고, 순서 관계를 고려할 필요가 없 다. 그러나 시간이 느리다는 단점이 있다. BOTTOM-UP방식은 for문을 사용하여 보다 프로그램의 속도가 빨라지지만, 구현이 덜 직관적이고, 순서 관계를 고려해야 한다는 단점이 있다. TOP-DOWN방식의 경우, 한 번 계산한 결과를 다시 계산하지 않게 하기 위해 memoization을 사용한다. 동적 계획법 BEFORE AFTER
  • 5. POSTECH Computer Algorithm Team 동적 계획법을 사용하기 위해서는 다음과 같은 조건을 만족해야 한다. F(x)에 대하여 동적 계획법을 사용할 때, F(a) = x, F(b) = y일 때 a == b이면, x ==y 를 만족해야 한다. 즉, 같은 입력값에 대해서는 항상 같은 출력값을 얻어야 한다. 예를 들어 피보나치 수열과 같은 경우에는 n번째 피보나치 수열의 값은 1가지로 일정하므로, 동적 계획법을 적용할 수 있지만, 한 점 s로부터 a까지의 경로를 출력하는 함수, F(a)가 있을 때, 하나의 a에 대하여 경로가 여러가지가 존재할 수 있으므로 동적 계획법을 적용할 수 없다. 동적 계획법
  • 6. POSTECH Computer Algorithm Team 동적 계획법 문제 해결 방법(가이드라인) 1. 변수를 몇 차원으로 할 것인가?(변수의 개수) 2. 각 변수의 의미는 무엇인가? 3. 변수로 인해 도출되는 DP값은 어떤 의미인가? 4. DP값 간의 관계(점화식)은 무엇인가? 5. 점화식을 이용하여 for문 또는 재귀함수로 구현한다. 이제 문제들을 풀어보며 간단한 감을 익혀보자. 동적 계획법
  • 7. POSTECH Computer Algorithm Team 2xN Tiling(11276)
  • 8. POSTECH Computer Algorithm Team Naive한 방법을 사용하면 직접 타일들을 배치하면서 경우의 수를 셀 수 있다. 당연하게도 이 방법은 무리가 있다. 그럼 먼저 타일 배치에 대한 특징을 알아보자. 만약 오른쪽과 같이 두 타일을 어긋나게 배치해보자. 그렇다면, 나머지 타일들은 어떻게 배치하더라도 빈 공간이 생기게 되어 2xN의 직사각형을 모두 채울 수 없음을 알 수 있다. 따라서 아래의 두 종류로만 타일을 배치할 수 있음을 알 수 있다. 2xN Tiling
  • 9. POSTECH Computer Algorithm Team 그렇다면 동적 계획법을 어떻게 적용해야 할까? 여기서는 F(A)=B를 다음과 같이 정의할 것이다. -> B는 2xA 모양 직사각형을 채우는 경우의 수 그렇다면 점화식을 어떻게 세울 수 있을까? 위 그림과 같이 2xA의 직사각형을 채우기 위해서는 2x(A-2)의 직사각형에 가로 타일 2개 또는 2x(A-1)의 직사각형에 세로 타일 1개를 놓아서 채울 수 있다. 2xN Tiling 2x(A-2) 2x(A-1)
  • 10. POSTECH Computer Algorithm Team 그렇다면 2xA 직사각형을 채우는 경우의 수는 2x(A-2) 직사각형을 채우는 경우의 수와 2x(A-1) 직사각형을 채우는 경우의 수의 합임을 알 수 있다. 즉, F(A) = F(A-1) + F(A-2)의 점화식이 성립함을 알 수 있다. F(0) = 0, F(1) = 1임은 당연하므로, 이를 이용하면 O(n) 안에 계산을 할 수 있다. 분할 정복과 행렬을 사용하여 O(logn)만에 구하는 방법도 있으니 관심있으면 찾아보자. 2xN Tiling
  • 11. POSTECH Computer Algorithm Team LIS(Longest Increasing Subsequence)는 한 수열에서 앞에서부터 뒤로 숫자를 하나씩 선택하여 부분 수열을 구성해 나갈 때 증가하는 순서대로 숫자를 고르면서 고른 부분 수열의 길이가 최대 길이가 되도록 숫자를 선택하는 경우이 다. 예시를 들어 다음과 같은 배열이 있을 때 이 배열의 LIS는 아래와 같이 색칠된 부분이 된다. LIS(최장 증가 수열)
  • 12. POSTECH Computer Algorithm Team 원래 LIS는 O(nlogn)으로 구현할 수 있지만, DP의 원리를 알아보기 위해 O(n^2)의 방법을 사용하자. 또한 이 방법은 오늘의 문제 JLIS에서 응용되어 사용되므로 방법을 익혀보자. 가장 직관적인 방법은 모든 부분 수열을 생성한 다음에 그 수열이 증가 수열인지를 검사하고, 증가 수열인 것 중에 서 최대의 길이를 가진 것이 LIS임을 알 수 있다. 물론 이 때는 O(n*2^n)이므로 시간 초과가 일어나게 된다. 그렇다면 동적 계획법을 어떻게 이용해야 할까? LIS(최장 증가 수열)
  • 13. POSTECH Computer Algorithm Team 먼저 F(A) = B를 다음과 같이 정의하자. -> A번째 숫자를 첫 번째 숫자로 가지는 LIS의 길이 B 그렇다면, F(N) = 1임은 당연하고(한 글자 이므로), F(A)를 구하는 방법을 생각해보자. 그렇다면 다음과 같이 생각할 수 있다. LIS(최장 증가 수열) Cache[i] i 0 1 2 3 4 5 6 7 8 0 0 0 0 0 0 0 0 1
  • 14. POSTECH Computer Algorithm Team LIS(최장 증가 수열) Cache[i] i 0 1 2 3 4 5 6 7 8 0 0 0 0 0 0 0 2 1 Cache[i] i 0 1 2 3 4 5 6 7 8 0 0 0 0 0 0 3 2 1
  • 15. POSTECH Computer Algorithm Team LIS(최장 증가 수열) Cache[i] i 0 1 2 3 4 5 6 7 8 0 0 0 0 0 3 3 2 1 Cache[i] i 0 1 2 3 4 5 6 7 8 0 0 0 0 4 3 3 2 1
  • 16. POSTECH Computer Algorithm Team 이와 같은 방법을 반복하면, LIS의 길이를 구할 수 있음을 알 수 있다. 만약 LIS의 길이가 아닌 LIS 자체를 구하고 싶다면, back 배열을 추가로 만들어서 cache가 갱신되도록 한 위치를 저장하면, LIS를 구할 수 있다. 후에 배울 이 진 탐색을 활용하면 O(nlogn)의 속도로 구현할 수 있다. LIS(최장 증가 수열) Cache[i] i 0 1 2 3 4 5 6 7 8 6 5 4 4 4 3 3 2 1
  • 17. POSTECH Computer Algorithm Team https://algospot.com/judge/problem/read/ASYMTILING https://algospot.com/judge/problem/read/PI https://algospot.com/judge/problem/read/QUANTIZE https://algospot.com/judge/problem/read/WILDCARD https://algospot.com/judge/problem/read/JLIS 예시 문제