💡기본 정보
유형
: DP
풀이 날짜
: 2025년 01월 31일
풀이방법 한줄 요약
: bottom-up형식으로 점화식을 활용해서 범위 동안 반복문 사용
💡문제에서 구해야 할 것
기타리스트 강토는 다가오는 공연에서 연주할 N개의 곡을 연주하고 있음 .
공연이 시작하기 전에 각각의 곡이 시작하기 전에 바꿀 수 있는 볼륨의 리스트를 만들었음.
이 리스트를 V라고 했을 때 V[i]는 i번째 곡을 연주하기 전에 바꿀 수 있는 볼륨을 의미. 항상 리스트에 적힌 차이로만 볼륨을 바꿀 수 있음
현재 볼륨이 P이고 지금 i번 째 곡을 연주하기 전이라면 i번 곡은 P+V[i] 나 P-V[i]로 연주해야함
하지만 0보다 작은 값으로 볼륨을 바꾸거나 M보다 큰 값으로 볼륨을 바꿀 수 없음
곡의 개수 : N
시작 볼륨 : S
최댓값 : M
N,S,M이 주어졌을 때 마지막 곡을 연주할 수 있는 볼륨 중 최댓값을 구하는 프로그램. 모든 곡은 리스트에 적힌 순서대로 연주해야함
- 입력 : 첫째 줄에 N,S,M이 주어짐
둘째 줄에는 각 곡이 시작하기 전에 줄 수 있는 볼륨의 차이가 주어짐 이 값은 1보다 크거나 같고 M보다 작거나 같음
- 출력 : 첫째 줄에 가능한 마지막 곡의 볼륨 중 최댓값을 출력
만약 마지막 곡을 연주할 수 없다면 -1을 출력
💡알고리즘 설계
- Bottom-up 방식으로 반복문 구현
- 이전 곡에서 볼륨 P가 가능한경우 P+V[i]나 P-V[i]가 가능한 상황
- dp[N][i]가 1인 값들 중 최댓값 출력
💡CODE
const fs = require("fs");
const input = fs.readFileSync(0,"utf8").toString().split("\n");
const [N,S,M]=input[0].split(" ").map(Number);
const V = input[1].split(" ").map(Number);
let answer = -1;
const dp = Array.from(Array(N+1),()=>Array(M+1).fill(0));
dp[0][S]=1;
for(let i =1; i<N+1;i++){
for(let P = 0; P<=M;P++){
if(dp[i-1][P]){
if(P-V[i-1]>=0)dp[i][P-V[i-1]]=1;
if(P+V[i-1]<=M)dp[i][P+V[i-1]]=1;
}
}
}
for(let i = 0; i<=M;i++){
if(dp[N][i])answer=Math.max(answer,i);
}
console.log(answer);
💡시간복잡도
💡 틀린 이유 & 틀린 부분 수정
dp[0][S]=1 이라고 초기값을 설정을 안하고 answer=-1로 초기값을 설정을 안했음
💡 다른 풀이 or 기억할정보
-