[백준/JAVA] 1495번: 기타리스트
🔺 문제
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