코딩테스트 파이썬/백준
기타리스트 ( 1495 번 )
세용용용용
2025. 8. 18. 20:26
🧠 알고리즘
- 동적 프로그래밍(Dynamic Programming, DP)
✔️ 동작 방식
- dp[i][j] = i번째 곡에서 볼륨 j가 가능한가 여부를 저장하는 2차원 DP 테이블 생성
- 각 곡마다 현재 가능한 볼륨을 기준으로, 다음 곡 경우 체크
- 테이블을 끝까지 채운 후, 마지막 곡(n번째)에서 가능한 최대 볼륨을 찾음
🧾 코드
import sys
def _main(n, s, m):
v_list = list(map(int, sys.stdin.readline().rstrip().split()))
dp = [[0] * (m + 1) for _ in range(n + 1)]
dp[0][s] = 1 # 시작 볼륨
for i in range(n):
for j in range(m + 1):
if dp[i][j] == 1: # 볼륨이 있는 경우
min_v, max_v = j - v_list[i], j + v_list[i]
if min_v >= 0: # 최소 불륨이 0 이상 이면
dp[i + 1][min_v] = 1
if max_v <= m: # 최대 볼륨이 임계치를 넘지 않는 경우
dp[i + 1][max_v] = 1
# 마지막 최대 볼륨 리턴
for idx in range(m, -1 , -1):
if dp[-1][idx] == 1:
return idx
return -1
n, s, m = map(int, sys.stdin.readline().rstrip().split())
print(_main(n, s, m))
⏱️ 시간 복잡도
for i in range(n) : 각 단계를 순회 ( 선형 시간 복잡도 )
for j in range(m + 1) : 각 볼륨을 순회 ( 선형 시간 복잡도 )
해당 알고리즘 시간 복잡도 : 이차형 시간 복잡도 ( O(n ** 2) )