알고리즘
[백준] 1328번 고층빌딩 DP ( python )
bumheeeee
2025. 7. 18. 18:22
인생 처음으로 푸는 플레 문제이다.
DP 문제를 풀면서 느끼는 건데 뭔가 이 알고리즘에 대해 깨달았다.
이 문제 푸는데도 그렇게 엄청 어렵다 정도는 아니었다.
( 패드가 방전되어서 오랜만에 빡지로 풀어보기.. )
꽤 간단했다.
문제 설명 )
작은 빌딩을 설치해야 하는 상황이다.
자 우리가 건물을 바라볼 때 큰 건물 뒤에 작은 건물이 있다면 과연 그 건물이 보일까?
이 문제가 그런 방식으로 접근을 하는 것!!
어찌 됐든 작은 빌딩이 양쪽 맨 끝에 두었을 때 보일까? 제일 처음에 있는 빌딩이라 무조건 보인다.
그래서 +1이 된다.
그럼 많고 많은 빌딩 사이에 작은 빌딩이 낀다면? 보이지 않을 것이다.
자 문제의 규칙성을 찾아냈다.
그럼 결론적으로 점화식은?
dp [N][L][R] = dp [N-1][L-1][R] + dp [N-1][L][R-1] + (dp [N-1][L][R]*(N-2))
왼쪽에 설치한 경우 + 오른쪽에 설치한 경우 + 가운데에 배치한 경우
맞은 코드
N, L, R = map(int, input().split())
dp = []
for n in range(N + 1):
layer = []
for l in range(L + 1):
row = [0] * (R + 1)
layer.append(row)
dp.append(layer)
dp[1][1][1] = 1
for n in range(2, N + 1):
for l in range(1, L + 1):
for r in range(1, R + 1):
dp[n][l][r] += dp[n - 1][l - 1][r]
dp[n][l][r] += dp[n - 1][l][r - 1]
dp[n][l][r] += dp[n - 1][l][r] * (n - 2)
dp[n][l][r] %= 1000000007
print(dp[N][L][R])
이 문제를 풀면서 뭔가 자신감이 더 오르게 된 계기가 된 거 같다.
진짜 거짓말 안치고 1년 전만 해도 알고리즘 사용도 못해서 쩔쩔매고 언어를 사용해서 문제를 풀려해도 힘들고 구현 문제도 풀지 못했는데
이제는 언어가 몸에 익어서 생각을 어떻게 더 잘하냐가 중요한 과제가 된 거 같다.