일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 괜찮음
- 프로젝트
- 10분
- 쓰릴오브파이트
- 30분
- 스탭퍼
- FIT XR
- 월간
- 매일
- 읽기
- 개발자
- 링피트
- 영어공부
- 잡생각
- 만화도
- Daily Challenge
- 영어원서읽기
- English
- 파비최
- 리얼 클래스
- Problem Solving
- 운동
- 사이드
- realclass
- 3줄정리
- 뭐든
- 미드시청
- 화상영어
- leetcode
- Writing
Archives
- Today
- Total
파비의 매일매일 공부기록
DP 정복 - 4.2 다이내믹 프로그래밍을 사용한 문제 해결 : 예제 풀기 1 본문
DP를 이용한 첫 번째 예제는 '타일로 공터 채우기' 다.
BOJ에 동일한 문제가 올라와 있어서 링크도 남김.
https://www.acmicpc.net/problem/11726
책에서 제시한 풀이법은 다음과 같다.
1. 첫 번째 타일을 세로로 배치하면 2 x (n-1) 크기의 공터에 타일을 배치하는 경우의 수로 문제가 재정의 됨
2. 첫 번째 타일을 가로로 배치하면 2 x (n-2) 크기의 공터에 타일을 배치하는 경우의 수로 문제가 재정의 됨.
그러므로 종료 조건은
1. n=1이면 세로로 한 개의 타일 놓는 법 밖에 없음.
2. n=2이면 타일을 가로로 2개 놓거나 세로로 2개 놓는 법 밖에 없음.
위의 내용을 그대로 코드로 옮기면 다음과 같다.
import sys
sys.setrecursionlimit(10**5)
def solve(n):
if n == 1:
return 1
if n == 2:
return 2
return solve(n - 1) + solve(n - 2)
if __name__ == '__main__':
n = int(input())
print(solve(n) % 10007)
문제는 n이 커지면 커질수록 시간 및 공간 복잡도가 늘어나기 때문에
메모이제이션을 해서 해당 이슈를 좀 줄여보도록 하자. (여기서부턴 내가 짠 소스)
import sys
sys.setrecursionlimit(10 ** 5)
dp = [0, 1, 2] + [-1 for _ in range(1000)]
def solve(n):
if dp[n] != -1:
return dp[n]
dp[n] = solve(n - 1) + solve(n - 2)
return dp[n]
if __name__ == '__main__':
n = int(input())
print(solve(n) % 10007)
어라..? 이게.. 되네...?? ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
제출을 했더니 가뿐하게 통과!!
(참고로 피보나치수열의 메모 이제이 션 예를 책에서 찾아서 구현했다.)
이제 이 소스를 다이내믹 프로그래밍 소스로 바꿔 보았다.
import sys
sys.setrecursionlimit(10 ** 5)
dp = [0, 1, 2] + [-1 for _ in range(1000)]
if __name__ == '__main__':
n = int(input())
for i in range(3, 1001):
dp[i] = (dp[i - 1] + dp[i - 2]) % 10007
print(dp[n])
오.. 이것도 되네?? ㅋㅋㅋㅋㅋㅋㅋㅋ
문제가 도형으로 설명돼서 그렇지 '피보나치수열'의 값을 구하는 거랑 크게 차이가 없는 소스였다.
뭔가 기본을 배운 것 같은 느낌적인 느낌?
내일 풀어볼 예제도 이렇게 술술 풀렸으면 좋겠다.
반응형
'Study > Algorithm 문제풀이' 카테고리의 다른 글
DP 정복 - 4.2 다이내믹 프로그래밍을 사용한 문제 해결 : 예제 풀기 3 (0) | 2021.08.31 |
---|---|
DP 정복 - 4.2 다이내믹 프로그래밍을 사용한 문제 해결 : 예제 풀기 2 (0) | 2021.08.30 |
DP 정복 - 4.2 다이내믹 프로그래밍을 사용한 문제 해결 (0) | 2021.08.28 |
DP 정복 - 4.1 세 방법을 차례대로 적용하며 문제 풀기 (0) | 2021.08.27 |
DP 정복 - 3.2 하향식 접근 방법과 상향식 접근 방법 (0) | 2021.08.26 |
Comments