본문 바로가기
백준/DP

백준 1495. 기타리스트

by 29살아저씨 2021. 9. 27.
반응형

🅰 백준 1495. 기타리스트

 

1495번: 기타리스트

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

www.acmicpc.net

✏️ 문제 풀이

  • 기타리스트 문제에서는 행을 각 곡의 개수, 열을 0~M(최대 볼륨)으로 설정한 다음 dp를 수행한다
  • 점화식은 D[i][j] = D[i+1][j+V[i+1]] = 1, D[i+1][j-V[i+1]] = 1이 될 수 있다.
  • i+1에 데이터를 저장할 때 0~M사이에 있으면 dp에 저장을 하면서 마지막 곡까지 반복수행한다.
  • 마지막 곡의 볼륨조절이 끝난 후 그 행에 있는 볼륨 중 최대값을 출력하면 최대값을 출력한다.

✏️ 소스코드

package dp;

import java.io.*;
import java.util.LinkedList;
import java.util.StringTokenizer;
/*
 * 점화식 : D[i][j]가 1이면 D[i+1][j+V[i+1]]도 1, D[i+1][j-V[i+1]]도 1이 될 수 있다.*/
public class Main_실버1_1495_기타리스트 {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken());
		int S = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
		boolean D[][] = new boolean[101][1001];
		int ans = -1;
		int vol[] = new int[N];
		st = new StringTokenizer(br.readLine());
		for (int i = 0; i < N; i++) {
			vol[i] = Integer.parseInt(st.nextToken());
		}
		
		// 기저조건
		if(S-vol[0]>=0) D[0][S-vol[0]] = true;
		if(S+vol[0]<=M) D[0][S+vol[0]] = true;

		for (int i = 0; i < N-1; i++) {
			for (int j = 0; j <= M; j++) {
				if(!D[i][j]) continue;
				
				if(j-vol[i+1] >= 0) {
					D[i+1][j-vol[i+1]] = true;
				}
				if(j+vol[i+1]<=M) {
					D[i+1][j+vol[i+1]] = true;					
				}
			}
		}
		for (int i = 0; i <= M; i++) {
			if(D[N-1][i] && i>ans) ans = i;
		}
		System.out.println(ans);
	}
}

 

✅ 후기

  • dp는 2차원배열로 푼다면 행과 열을 어떤 걸로 정할지가 가장 중요한 것 같다.(개인적인 생각) 물론 3차원 배열 등 다양한 방법들을 이용해서 푸는 법을 더 익혀야겠다.
반응형

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

백준 5557. 1학년  (0) 2021.09.27
백준 12920. 평범한 배낭 2  (0) 2021.09.27
백준 12865. 평범한 배낭  (0) 2021.09.26
백준 2294. 동전 2  (0) 2021.09.26
백준 11066 파일합치기  (0) 2021.09.26

댓글