이번 문제는 Platinum II로 꽤 높게 책정된 문제입니다.
문제 자체는 상당히 쉽습니다. 1부터 n까지

여기서는 파스칼의 삼각형과 연관된 이항계수에 대해서 먼저 알고 있어야 합니다.
이항 계수는 n개에서 r개를 고르는 경우의 수를 나타내는 것으로
다음 코드는 파스칼 삼각형을 이용해서 주어진 n에 대해서 이항계수를 구하는 것입니다. 사실 그냥 for 루프를 이용해서 작성할 수 있겠지만, 여기서는 동적 계획법을 이용했습니다.
MOD = 1000000007
pascal = [ None ]*52
pascal[0] = (1,)
def getPascal(n):
if pascal[n] != None: return pascal[n]
x = getPascal(n-1)
v = [1, ]
for i in range(n-1):
v.append((x[i]+x[i+1])%MOD)
v.append(1)
pascal[n] = tuple(v)
return pascal[n]
파스칼 삼각형의 한줄을 구하는 프로그램이자,
다음은
예를 들어서
을 얻을 수 있습니다.
인 것에 착안하여 위의 식에 양벽에
을 얻게 됩니다.
그러면 우리가 이미 알고 있다고 가정한 것을 위에 적용합니다.
을 얻게 됩니다. 최종적으로는 우리가 잘 알고 있는 형태로
가 되는 것이죠.
재귀적으로 동적 계획법을 잘 이용해서 프로그램을 작성하면 됩니다.
숫자가 커지기 때문에 나누기는 파이썬의 pow( n, -1, 1,000,000,007 ) 함수를 이용하여 역수를 구한 후 곱했습니다.
프로그램을 작성하고 보니, 꽤 내용이 커지게 되네요.
'Programming > BOJ' 카테고리의 다른 글
#1494 절대값 수열 (0) | 2022.08.22 |
---|---|
#1493 박스 채우기 (0) | 2022.08.21 |
#1489 대결 (0) | 2022.08.19 |
#1476 날짜 계산 (0) | 2022.08.19 |
#1475 방 번호 (0) | 2022.08.18 |
댓글