* 체크 리스트
시간
- 즉시 작성 가능
- 1시간 이내
- 1시간 이상
- 하루 이상
이해도
- 이해 완료
- 복습 필요
- 부분 이해
- 이해 불가
체감 난이도
- 최상
- 상
- 중
- 하
- 최하
문제
2×n 크기의 직사각형을 1 × 2, 2 ×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)
출력
첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.
핵심 풀이
다이나믹 프로그래밍(DP)의 풀이의 핵심은 '규칙'을 찾아야 한다.
위 그림을 보면 1x2크기의 직사각형을 2xN 크기의 직사각형에 직접 대입해 보았다.
2X1 | 2X2 | 2X3 | 2X4 | 2X5 |
1개 | 2개 | 3개 | 5개 | 8개 |
표와 같이 1,2,3,5,8개로 일정한 규칙이 있다. 즉, 1+2 = 3 / 2+3 = 5 / 3+5 = 8인데, 이를 식으로 나타내면
d(n) = d(n-1)+d(n-2)
로써 표현이 가능.
풀이 1 - 오답
N = int(input())
def data(N):
if N == 1:
return 1
if N == 2:
return 2
return data(N-1)+data(N-2)
print(data(N) % 10007)
재귀 함수를 활용하여 코드를 풀어보려 했지만, 무한루프에 가까운 비효율의 극치이다. - 런타임 에러
풀이 2 - 반복문 사용
N = int(input())
# 1부터 N까지 숫자를 리스트에 넣는다.
res = [i+1 for i in range(N)]
# 2이하의 숫자는 그대로 출력한다.(규칙 없음)
if N <= 2:
print(N)
else:
# 3부터 N까지 규칙에 맞춰 대입한다.
for i in range(3, N):
res[i] = res[i-1]+res[i-2]
print(res[N-1] % 10007)
규칙이 없는 2 이하의 숫자는 그대로 출력한다.
그 외의 수는 d(n) = d(n-1)+d(n-2) 규칙을 활용하여 해결함.
출처
https://www.acmicpc.net/problem/11726
11726번: 2×n 타일링
2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.
www.acmicpc.net
깃 주소
https://github.com/justin-kim3000/Python_Algorithm/blob/main/DynamicProgramming/2xN(11726).py
GitHub - justin-kim3000/Python_Algorithm: Study
Study. Contribute to justin-kim3000/Python_Algorithm development by creating an account on GitHub.
github.com
'프로그래밍 > 알고리즘' 카테고리의 다른 글
[파이썬] 백준 알고리즘 3052 : 나머지 (Python) (1) | 2022.10.18 |
---|---|
[파이썬] 백준 11399 : ATM (python) (1) | 2022.10.08 |
[파이썬] 백준 1003 : 피보나치 함수 (1) | 2022.10.04 |
[파이썬] 백준 2630 : 색종이 만들기 (python) (2) | 2022.10.03 |
[파이썬] 백준 1676: 팩토리얼 0의 개수(python) (0) | 2022.10.01 |
댓글