300x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- AI
- 리눅스
- 구글 킥스타트
- 파이썬
- kick start
- linux
- 동적프로그래밍
- dp
- nlp
- 브루트포스
- 딥러닝
- 킥스타트
- 운영체제
- BFS
- 알고리즘
- 그래프
- CSS
- PYTHON
- 프로그래밍
- 네트워크
- 백준
- DFS
- 프로그래머스
- 순열
- 동적 프로그래밍
- google coding competition
- 코딩 테스트
- OS
- 코딩
- 코딩테스트
Archives
- Today
- Total
오뚝이개발자
[백준11727] 2 x n 타일링 2 본문
728x90
300x250
문제
https://www.acmicpc.net/problem/11727
생각의 흐름
동적 프로그래밍을 사용하여 dp[i]에 2xi를 채우는 경우의 수를 계산하여 넣으면 된다. 점화식은 dp[i]=dp[i-2]*2+dp[i-1]이 되는데 이유는 다음과 같다.
(i-1) 개 | 2x1 |
(i-2)개 | 2x1 | 2x1 |
(i-2)개 | 1x2 | |
1x2 |
(i-2)개 | 2x2 |
위의 그림과 같은 경우가 있는데, 이 중 두번째 경우는 첫번째 경우에 포함이 될 수 있다. 따라서 dp[i-2]*3이 아닌 dp[i-2]*2가 되는 것이다.
깨달은 점
계속 런타임 에러가 나길래... 원인이 뭔가 했더니 n=1인 경우를 고려해주지 않고 dp[2]를 설정해버리면 안된다! 리스트의 index가 out of range가 되기 때문. 해당 부분은 sys.exit()으로 handle해주었다.
코드
# 백준11727
import sys
n = int(input())
dp = [0]*(n+1)
if n==1:
print(1)
sys.exit()
dp[1], dp[2] = 1, 3
for i in range(3, n+1):
dp[i] = ((2*dp[i-2])%10007 + (dp[i-1])%10007)%10007
print(dp[n])
728x90
300x250
'코딩 테스트 > 백준' 카테고리의 다른 글
[백준11057] 오르막수 (0) | 2020.04.26 |
---|---|
[백준9465] 스티커 (2) | 2020.04.23 |
[백준11722] 가장 긴 감소하는 수열 (0) | 2020.04.20 |
[백준11052] 카드 구매하기 (0) | 2020.04.17 |
[백준16194] 카드 구매하기 2 (0) | 2020.04.15 |
Comments