코테/백준

[백준/JAVA] 1495번: 기타리스트

imname1am 2023. 5. 30. 00:17
반응형

🔺 문제

 

1495번: 기타리스트

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

www.acmicpc.net

 

🔺 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import java.util.*;
import java.io.*;
 
public class Main {
    static int N, S, M;
    static int[] V;
    static int[][] dp;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        
        N = Integer.parseInt(st.nextToken());   // 곡 개수
        S = Integer.parseInt(st.nextToken());   // 시작 볼륨
        M = Integer.parseInt(st.nextToken());   // 최대 볼륨
        
        // 볼륨 배열 입력받기
        V = new int[N];
        st = new StringTokenizer(br.readLine()," ");
        for(int i = 0 ; i < N ; i++) {
            V[i] = Integer.parseInt(st.nextToken());
        }
        
        // DP 배열 채우기
        dp = new int[M + 1][N];
        for(int[] arr : dp) {
            Arrays.fill(arr, -2);
        }
        
        System.out.println(solve(S, 0));
        br.close();
    }
    
    public static int solve(int sum, int idx) {
        // 범위를 벗어난 경우
        if(sum > M || sum < 0)
            return -1;
        
        // 배열 끝에 도달한 경우
        if(idx == N)
            return sum;
       
        // 해당 값이 이미 계산된 경우
        if(dp[sum][idx] != -2)
            return dp[sum][idx];
            
        return dp[sum][idx] = Math.max(dp[sum][idx], Math.max(solve(sum + V[idx], idx + 1), solve(sum - V[idx], idx + 1)));
    }
}
cs
✅ 해결 아이디어
✔ DP ( 메모이제이션. Bottom-Up 방식)
- V[v] = i : i번째 연주에서 볼륨 v로 연주 가능

 

 


🔺 다른 풀이들

- 1차원 배열 사용. 가능한 볼륨값을 리스트로 저장해놓고, 한 번에 V 배열 값을 바꿔주심..

내 기준 이 풀이가 가장 이해가 잘 되었다. (복습용)

(volume[v] = i  : 볼륨 v로 연주할 수 있는 곡 번호는 i)

 

[백준] 1495 : 기타리스트 (JAVA/자바)

BOJ 1495 : 기타리스트 - https://www.acmicpc.net/problem/1495N개의 곡 연주하는데, 볼륨의 선택지는 2가지이다. 기존 볼륨+V\[i]와 기존볼륨-V\[i]. 처음엔 재귀 호출로 풀이하려고 생각했는데 N이 최대 100이기

velog.io

 

[백준 1495번] 기타리스트 - java

문제 설명 1. 연주할 곡 N, 시작 볼륨 S, 최대 볼륨 M이 주어진다. 2. N개의 변경할 볼륨의 크기가 주어진다. 3. 모든 곡의 볼륨은 최대 볼륨 M을 넘어서는 안된다. 4. 마지막 곡에 연주 가능한 최대 볼

hello-backend.tistory.com

 

 

- 약간 로직 그대로가 보이는 코드

 

[백준BOJ] 1495번 기타리스트.java

백준 저지에서 기타리스트를 자바를 통해 풀어 보았다. https://www.acmicpc.net/problem/1495 1495번: 기타리스트 첫째 줄에 N, S, M이 주어진다. (1 ≤ N ≤ 100, 1 ≤ M ≤ 1000, 0 ≤ S ≤ M) 둘째 줄에는 각 곡이

moz1e.tistory.com

 

- 2차원 boolean 배열 사용하고 입력받자마자 바로 dp에 값 저장하심ㅎㅎ (캐쉽게 푸심)

https://www.acmicpc.net/source/10221903

 

- 이 정도면 이해할 수 있음!! (이게 젤 간편한 코드 같음 굿!!)
https://www.acmicpc.net/source/8337693


💬 느낀 점

dp.. 아직도 개못하지만..

다른 분들 블로그 풀이 봐도 이해 못했지만...

다른분들 숏코딩 간단한 코드들 보고 좀 자신감을 얻었다..(?)

넘 어렵게 생각하지 말고 쉽게쉽게 생각하자 쫄지 말자!!

 

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

 

[BOJ] 백준 1495번 : 기타리스트 (JAVA)

문제 Day Of Mourning의 기타리스트 강토는 다가오는 공연에서 연주할 N개의 곡을 연주하고 있다. 지금까지 공연과는 다른 공연을 보여주기 위해서 이번 공연에서는 매번 곡이 시작하기 전에 볼륨을

steady-coding.tistory.com

 

반응형