문제
알고리즘
- 점화식을 구하면 쉽게 풀 수 있는 문제이다.
- 좌석이 1개일 때 경우의 수는 1개이고 좌석이 2개일 때 경우의 수는 2개이고 좌석이 3개일 때 경우의 수는 3개이다.
- 점화식: dp[n] = dp[n - 1] + dp[n - 2]
- 각 좌석의 개수에 따라 경우의 수를 구했다면 vip 유무에 따라 경우의 수를 곱해주면 된다.
- 반복문을 통해 vip 사이에 그룹에 들어가는 경우의 수를 확인해서 곱해줘 출력한다.
- vip가 없다면 n좌석의 경우의 수를 출력한다.
코드
import sys
n = int(sys.stdin.readline())
m = int(sys.stdin.readline())
vip = [int(sys.stdin.readline()) for _ in range(m)]
dp = [0] * (n + 1)
dp[0] = 1
dp[1] = 1 # 1
dp[2] = 2 # 1 2, 2 1
# dp[3] = 3 # 1 2 3, 1 3 2, 2 1 3
# 점화식 : dp[n] = dp[n - 1] + dp[n - 2]
for i in range(3, n + 1):
dp[i] = dp[i - 1] + dp[i - 2]
answer = 1 # 경우의 수
# vip의 유무에 따라 경우의 수를 도출
if m > 0:
pre = 0
# 반복문을 통해 vip 사이에 그룹에 들어가는 경우의 수를 확인
for j in range(m):
answer *= dp[vip[j] - 1 - pre]
pre = vip[j]
answer *= dp[n - pre]
else:
answer = dp[n]
print(answer)
github
'CodingTest > Baekjoon' 카테고리의 다른 글
[baekjoon] 백준 2502번(파이썬): 떡 먹는 호랑이 (0) | 2022.02.06 |
---|---|
[baekjoon] 백준 2410번(파이썬): 2의 멱수의 합 (0) | 2022.02.03 |
[baekjoon] 백준 2294번(파이썬): 동전 2 (0) | 2022.02.01 |
[baekjoon] 백준 2011번(파이썬): 암호코드 (0) | 2022.01.31 |
[baekjoon] 백준 1790번(파이썬): 수 이어 쓰기 2 (0) | 2022.01.30 |