본문 바로가기

ALGORITHM

백준 1495 기타리스트 (Java)

1. 문제 링크

 

1495번: 기타리스트

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

www.acmicpc.net

 

2. 문제 및 입출력예제

 

3. 문제 풀이

vol 배열에 시작 볼륨부터 입력받은 변경 값들을 저장한다.

visit 배열을 이용해서 곡 순서와 볼륨에 true를 넣어서 중복되지 않게 한다.

0과 최댓값 사이에 있지 않은 곡 순서와 볼륨일 경우 visit 배열에 -1을 넣고 return한다.

3에서 걸리지 않으면 다음 곡으로 넘어가서 재귀를 한다.

곡의 순서가 마지막까지 오면 그때의 볼륨과 최댓값을 비교해 최댓값을 정했다.

 

4. 코드

import java.io.BufferedReader;
import java.io.IOException;

public class Main {
	private static int n, s, m, max;
	private static int vol[], visit[][];

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new java.io.InputStreamReader(System.in));
		String[] nsm = br.readLine().split(" ");
		n = Integer.parseInt(nsm[0]);
		s = Integer.parseInt(nsm[1]);
		m = Integer.parseInt(nsm[2]);
		vol = new int[n+1];
		max = -1;
		String[] split = br.readLine().split(" ");

		vol[0] = s;
		for (int i = 1; i < n+1; i++) {
			vol[i] = Integer.parseInt(split[i-1]);
		}

		visit = new int[n+2][m+1];
		recursion(1,s);

		System.out.println(max);
	}

	private static void recursion(int start, int sum) {
		if(start == n+1) {
			max = Math.max(max, sum);
			return;
		}
		visit[start][sum] = 1;
		int plus = sum + vol[start];
		int minus = sum - vol[start];
		if(plus > m && minus < 0) {
			visit[start][sum] = -1;
			return;
		}
		if(plus<=m && visit[start+1][plus]!=1) { 
			recursion(start+1, plus);
		}
		if(minus>=0 && visit[start+1][minus]!=1) {
			recursion(start+1, minus);
		}
		return;
	}	
}

 

'ALGORITHM' 카테고리의 다른 글

백준 15683 감시 (Java)  (0) 2023.03.22
백준 1018 체스판 다시 칠하기 (Java)  (0) 2023.03.21
백준 10026 적록색약 (Java)  (0) 2023.03.20
백준 4153 직각 삼각형(Java)  (0) 2023.03.20
백준 17281 ⚾ 야구 (Java)  (0) 2023.03.19