[골드 3] 백준 1670 - 정상 회담 2 (파이썬)
글 작성자: pental
https://www.acmicpc.net/problem/1670
풀이
- 사람 수는 짝수 N이고, 각 사람은 한 명과만 악수할 수 있으며, 악수 선이 교차하지 않아야 한다.
- 이는 DP로 해결할 수 있으며, 다음 점화식을 따른다.
이 문제는 카탈란 수(Catalan Number) 문제 유형의 대표적인 예다.
핵심은 다음과 같다
- N명의 정상 중 한 명을 기준으로 짝을 지었을 때, 남은 좌우 인원들도 각각 교차 없이 짝을 지어야 한다.
- 이를 이용하면 DP 점화식을 다음과 같이 세울 수 있다.
D[0] = 1 # 아무도 없을 때는 1가지 (아무것도 안 하는 경우)
D[2] = 1 # 두 명이 있을 때는 1가지
D[n] = D[0]*D[n-2] + D[2]*D[n-4] + D[4]*D[n-6] + ... + D[n-2]*D[0]
즉, D[n]은 n명이 있을 때의 가능한 짝짓기 경우의 수이고, 각 항은 첫 번째 사람과 짝을 지은 이후 좌우로 나뉜 그룹들의 경우의 수를 곱해서 누적한 것이다.
코드
# 백준 1670 - 정상회담 2
# 분류 : 다이나믹 프로그래밍
N = int(input())
mod = 987654321
D = [0] * (N + 1)
D[0] = 1
for i in range(2, N + 1, 2) :
D[i] = 0
for j in range(0, i - 1, 2) :
D[i] += D[j] * D[i - 2 - j] % mod
D[i] %= mod
answer = 0
for i in range(0, N - 1, 2) :
answer += D[i] * D[N - 2 - i] % mod
answer %= mod
print(answer)
'Programming > 백준' 카테고리의 다른 글
[실버 1] 백준 12849 - 본대 산책 (파이썬) (0) | 2025.06.21 |
---|---|
[골드 5] 백준 2591 - 숫자카드 (파이썬) (0) | 2025.06.20 |
[실버 1] 백준 1446 - 지름길 (파이썬) (0) | 2025.05.27 |
[골드 3] 백준 1937 - 욕심쟁이 판다 (파이썬) (0) | 2025.05.26 |
[골드 3] 백준 1613 - 역사 (파이썬) (0) | 2025.05.25 |
댓글
이 글 공유하기
다른 글
-
[실버 1] 백준 12849 - 본대 산책 (파이썬)
[실버 1] 백준 12849 - 본대 산책 (파이썬)
2025.06.21 -
[골드 5] 백준 2591 - 숫자카드 (파이썬)
[골드 5] 백준 2591 - 숫자카드 (파이썬)
2025.06.20 -
[실버 1] 백준 1446 - 지름길 (파이썬)
[실버 1] 백준 1446 - 지름길 (파이썬)
2025.05.27 -
[골드 3] 백준 1937 - 욕심쟁이 판다 (파이썬)
[골드 3] 백준 1937 - 욕심쟁이 판다 (파이썬)
2025.05.26