Python/algorithm

N초 동안 가능한 스킬 조합 수 구하기

baecode 2025. 4. 20. 21:30
반응형

🧠 TIL - DP로 N초 동안 가능한 스킬 조합 수 구하기

오늘은 스킬의 사용 시간 제약이 있는 조합 문제를 DP로 해결해봤다.
핵심은 dp[i]“i초를 채우는 방법의 수”를 의미한다는 점이다.

📌 문제 요약

  • 스킬 A: 1초
  • 스킬 B: m초
  • 총 N초를 정확히 채울 수 있는 모든 조합의 수를 구하라
  • 결과는 1,000,000,007로 나눈 나머지 출력

📄 핵심 점화식

dp[i] = dp[i - 1] + dp[i - m]  (단, i ≥ m)

🔍 코드 설명

nanoom = 1_000_000_007
dp = [0] * (n + 1)
dp[0] = 1  # 0초는 아무 것도 안 쓰는 1가지 방법

for i in range(1, n + 1):
    dp[i] += dp[i - 1]  # a 스킬 사용 (1초짜리)
    if i >= m:
        dp[i] += dp[i - m]  # b 스킬 사용 (m초짜리)
    dp[i] %= nanoom  # 오버플로우 방지

print(dp[n])  # N초를 만드는 조합 수

🧪 예시

  • n = 3, m = 2
    가능한 조합: aaa, ab, ba → dp[3] = 3
  • n = 4, m = 2
    가능한 조합: aaaa, aab, aba, baa, bb → dp[4] = 5

✅ 요약 포인트

  • dp[0] = 1은 기저 조건
  • dp[i - m]은 반드시 i ≥ m일 때만
  • 중간 계산마다 % 1_000_000_007 꼭 해줘야 함
  • 문제는 “몇 가지 방법이 있냐”지, 길이나 순서를 묻는 건 아님
반응형

'Python > algorithm' 카테고리의 다른 글

김밥천국의 계단  (0) 2025.04.24
프로그래머스 신규 아이디 추천  (0) 2025.04.21
JadenCase 문자열 처리[프로그래머스]  (0) 2025.04.16
과자 나눠주기 [백준]  (0) 2025.04.14
백준 병든 나이트  (0) 2025.04.13