1947. 선물 전달
1947번: 선물 전달
경우의 수를 1,000,000,000으로 나눈 나머지를 첫째 줄에 출력한다.
www.acmicpc.net
풀이
- n번째 사람이 새로 들어왔다고 쳤을때 A(n)
- 내가 n번째 사람과 서로 교환한 경우
- 이미 존재하던 n-1명 그룹 중에서 나를 제외한 n-2명의 사람들끼리 교환
- n번째 사람이 (반드시 내가 아니라) n-1명 중 한명과 교환하는 것이므로 * (n-1)
- → A(n-2) * (n-1)
- n번째 사람 선물을 내가 받아놓고 나는 안 준 경우
- 내가 받은걸 숨기고 그대로 n-1명끼리 선물 교환 (나는 2개를 받게되지만 하나를 그다음에 n번째사람한테 준다고 치는 것)
- 여기도 n번째 사람이 (반드시 내가 아니라) n-1명 중 한명과 교환하는 것이므로 * (n-1)
- → A(n-1) * (n-1)
- 내가 n번째 사람과 서로 교환한 경우
- → 결과적으로 A(n)= A(n-2) * (n-1) + A(n-1) * (n-1) = (n-1) * (A(n-2) + A(n-1))
n = int(input())
if n == 1: # n=1 이면 dp[1]꺼지 만들어지는데 do[2]를 넣어서 에러
print(0)
exit()
dp = [0 for _ in range(n+1)]
dp[1] = 0
dp[2] = 1
for i in range(3, n+1):
dp[i] = ((i-1)*(dp[i-1]+dp[i-2])) % 1000000000
print(dp[n])
'코딩테스트 > BOJ' 카테고리의 다른 글
| [백준] [그리디] 1080. 행렬 📍 (1) | 2024.01.05 |
|---|---|
| [그리디] 2864. 5와 6의 차이 (0) | 2024.01.04 |
| [백준] [DP] 2229. 조 짜기 (0) | 2024.01.01 |
| [백준][그리디] 2217. 로프 (0) | 2023.12.28 |
| [백준][그리디] 1026.보물 (0) | 2023.12.28 |