코테 백준 2302 실버1

김동윤·2023년 8월 24일
0
post-thumbnail

백준 2302

이문제는 고등학교 때 배웠던 확률과 통계 풀이법을 사용한 문제이다. 나도 이 문제를 풀 때 어떻게 해야 할 지 막막했다. 그래서 다른 분의 풀이법을 참고했다. 일단은 vip가 없을 때 경우의 수를 해본다. 좌석이 1개일때는 1, 2개일때는 2, 3개일때는 3 대충 5까지하다보면은 규칙성이 보인다. 이걸 dp라는 배열에 dp[i]=dp[i-2]+dp[i-1] 라고 점화식을 세운다

그다음에는 vip는 고정이니깐 vip 좌석을 경계라고 두고 묶음들끼리 하면된다.
예를들면 1 2 3 vip 5 6 vip 8 9라고 하면은 (1,2,3) (5,6) (8,9)
즉 좌석이 3개일 때 경우의 수, 2개일 때 경우의 수, 2개일 때 경우의 수를 이용하는데 동시에 발생하니깐 이들을 곱해주면된다.

그래서 left를 경계의 시작 점이고 vip배열의 값이 경계의 끝점이라고 두고 위의 풀이를 이용하면 아래의 코드가 작성된다.

import sys
input=sys.stdin.readline

n=int(input())
m=int(input())
vip=[int(input()) for _ in range(m)]
dp=[0]*(n+1)
dp[0]=1
dp[1]=1
dp[2]=2

for i in range(3,n+1):
    dp[i]=dp[i-2]+dp[i-1]

total=1

if m>=1:
    left=0
    for i in range(m):
        total*=dp[vip[i]-1-left]
        left=vip[i]
    total*=dp[n-left]
else:
    total=dp[n]

print(total)
profile
Back-End

0개의 댓글