Algorithm/알고리즘 스터디(2021.07)
[Algorithm] 다이나믹 프로그래밍 타일링 문제 풀어보기 (1/2) (백준 11726번, 11727번)
binaryJournalist
2021. 9. 26. 18:14
반응형
인프런 알고리즘 강의 22강, 23강에 대한 리뷰이다.
1. 2xn 타일링, BaekJoon #11726
백준 dynamic programming 관련 문제 (https://www.acmicpc.net/problem/11726)
참고로 이 문제는 프로그래머스에도 있다. (https://programmers.co.kr/learn/courses/30/lessons/12900)
가로 길이가 1인 직사각형이 붙는 마지막 항은 n - 1 이고
가로 길이가 2인 직사각형이 붙는 마지막 항은 n - 2 이다.
이를 이용하면 재귀함수(n -1) + 재귀함수(n - 2) 를 리턴하면 된다.
** C++
#include <stdio.h>
int d[1001];
int dp(int x) {
if (x == 1) return 1;
if (x == 2) return 2;
if (d[x] != 0) return d[x];
return d[x] = (dp(x - 1) + dp(x - 2)) % 10007;
}
int main(void) {
int x;
scanf("%d", &x);
printf("%d", dp(x));
}
** Python
1) (근데 런타임에러남)
d = [0] * 1001
def dp(x):
if x == 1: return 1
if x == 2: return 2
if d[x] != 0: return d[x]
d[x] = (dp(x - 1) + dp(x - 2))
return d[x] % 10007
y = int(input())
print(dp(y))
2)
import sys
sys.setrecursionlimit(10**6)
d = [0] * 1001
def dp(x):
if x == 1: return 1
if x == 2: return 2
if d[x] != 0: return d[x]
d[x] = (dp(x - 1) + dp(x - 2)) % 10007
return d[x]
y = int(input())
r = dp(y)
print(r)
참고: https://kkkkhd.tistory.com/528
2. 2xn 타일링 2, BaekJoon #11727 (https://www.acmicpc.net/problem/11727)
가로 길이가 1인 직사각형이 오는 경우 마지막 항은 n - 1이고
가로 길이가 2이고 세로 길이가 1인 직사각형이 오는 경우 마지막 항이 n - 2,
가로 길이 2, 세로 길이 2가 2인 정사각형이 오는 경우 마지막 항이 n - 2 가 된다.
리턴 값은 재귀함수(n - 1) + 2 * 재귀함수 (n - 2) 이다.
** C++
#include <stdio.h>
int d[1001];
int dp(int x) {
if (x == 1) return 1;
if (x == 2) return 3;
if (d[x] != 0) return d[x];
return d[x] = (dp(x - 1) + 2 * dp(x - 2)) % 10007;
}
int main(void) {
int x;
scanf("%d", &x);
printf("%d", dp(x));
}
** Python
import sys
sys.setrecursionlimit(10**6)
d = [0] * 1001
def dp(x):
if x == 1: return 1
if x == 2: return 3
if d[x] != 0: return d[x]
d[x] = (dp(x - 1) + 2 * dp(x - 2)) % 10007
return d[x]
y = int(input())
r = dp(y)
print(r)
반응형