Programming/백준

[골드 3] 백준 1670 - 정상 회담 2 (파이썬)

pental 2025. 6. 22. 12:21

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)