Sangmun

백준 1495번 기타리스트 본문

알고리즘/백준

백준 1495번 기타리스트

상상2 2023. 2. 6. 11:01

https://www.acmicpc.net/problem/1495

 

1495번: 기타리스트

첫째 줄에 N, S, M이 주어진다. (1 ≤ N ≤ 50, 1 ≤ M ≤ 1,000, 0 ≤ S ≤ M) 둘째 줄에는 각 곡이 시작하기 전에 줄 수 있는 볼륨의 차이가 주어진다. 이 값은 1보다 크거나 같고, M보다 작거나 같다.

www.acmicpc.net

다이나믹 프로그래밍으로 해결이 가능한 문제이며 또한 탐색해야되는 범위가 적기 때문에 2중 for문으로도 해결이 가능한 문제이다.

볼륨을 변경해야하는 단계마다 어떠한 볼륨으로 변경이 가능한지를 dp matrix에 저장을 해놓고 모든 경우의 수를 계산하해주면 된다.

 

문제의 예제 1번은

3 5 10
5 3 7

 

아래와 같은 형태로 dp matrix의 이전의 상태를 기록해주게 된다.

[[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
 [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
 [0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0],
 [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]]

최종 정답은 dp maxrix의 마지막 row에서의 최대값인 10이다.

 

 

* 전체코드

import sys
input = sys.stdin.readline
n, s, m = map(int,input().split())
volume = list(map(int,input().split()))

dp = [[0]*(m+1) for _ in range(n+1)]

dp[0][s] = 1

for idx, each in enumerate(volume):
    for idx2, k in enumerate(dp[idx]):
        if k:
            upper = idx2 + each
            lower = idx2 - each

            if upper <= m:
                dp[idx+1][upper] = 1

            if lower >= 0:
                dp[idx+1][lower] = 1

max_value = -1
for idx, each in enumerate(dp[n]):
    if each:
        if idx > max_value:
            max_value = idx

print(max_value)

'알고리즘 > 백준' 카테고리의 다른 글

백준 17976번 Thread knots  (0) 2023.05.13
백준 7490번 0 만들기  (0) 2023.02.04
백준 1449번 수리공  (0) 2023.02.03
백준 1049번 기타줄  (0) 2023.02.03
백준 11057 오르막 수  (0) 2022.12.22
Comments