💬 문제
철수는 그의 바둑이들을 데리고 시장에 가려고 한다.
그런데 그의 트럭은 C킬로그램 넘게 태울수가 없다.
철수는 C를 넘지 않으면서 그의 바둑이들을 가장 무겁게 태우고 싶다.
N마리의 바둑이와 각 바둑이의 무게 W가 주어지면, 철수가 트럭에 태울 수 있는 가장 무거운 무게를 구하는 프로그램을 작성하세요.
🔨 입력
첫 번째 줄에 자연수 C(1<=C<=100,000,000)와 N(1<=N<=30)이 주어집니다.
둘째 줄부터 N마리 바둑이의 무게가 주어진다.
🔨출력
첫 번째 줄에 가장 무거운 무게를 출력한다.
👊🏻 예시 입력 1
259 5
81
58
42
33
61
👊🏻 예시 출력 1
242
💡 해결
최고,최대를 구하는 문제는 대부분 DFS를 이용한다고 봐도 무방하다.
모든 경우에서 c를 넘지 않는 최대치를 구하는 문제이다.
트리를 만들어서 모든 경우에서 c를 넘지 않는 것 중 최대치를 구한다고 생각하면 된다.
public static void DFS(int L,int sum, int[] arr) {
if(sum>c) return;
if(L==n){
answer = Math.max(answer,sum);
}
else{
DFS(L+1,sum+arr[L],arr);
DFS(L+1,sum,arr);
}
DFS 함수라고 하면 예전에는 엄청 어렵게만 느꼈는데, 그다지 어렵지않고 재귀를 이용해 간편하다고 생각든다.
먼저 타입인자로는, L,sum, int[] arr 를 받는다. L은 트리에서 level을 의미한다.
level이 n과 같아지면 탐색을 종료한다.
트리의 자식노드는 바둑이를 태운다, 안태운다 각각 두개로 나뉘어진다. 태우면 sum자리에 sum+arr[L]을 넣어서
다시 DFS를 재귀 호출하면 되는것이고 그렇지 않다면, sum을 그대로 넣어 재귀호출한다.
그 도중에 sum이 최대 한계값인 c보다 커지게되면 종료해주면 된다.
L이 n과 같아지면 트리의 가장 밑 레벨까지 왓다는 것이고 그 중에서 max 값을 골라내면된다.
👨🏻💻 CODE
import java.util.*;
public class Main {
static int answer = Integer.MIN_VALUE,c,n;
public static void DFS(int L,int sum, int[] arr) {
if(sum>c) return;
if(L==n){
answer = Math.max(answer,sum);
}
else{
DFS(L+1,sum+arr[L],arr);
DFS(L+1,sum,arr);
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
c = in.nextInt();
n = in.nextInt();
int[] arr = new int[n];
for(int i=0; i<n; i++){
arr[i] = in.nextInt();
}
DFS(0,0,arr);
System.out.println(answer);
}
}
💪🏻 결과
한줄끄적: DFS 마스터를 향하여
'문제 풀이 > 인프런' 카테고리의 다른 글
[JAVA11/알고리즘] 7-8 송아지 찾기 1 (BFS : 상태트리탐색) (1) | 2022.09.02 |
---|---|
[JAVA11/알고리즘] 6-7 좌표 정렬 (0) | 2022.08.28 |
[JAVA11/알고리즘] 5-8 응급실 (0) | 2022.08.25 |
[JAVA11/알고리즘] 5-6 공주 구하기 (3) | 2022.08.24 |
[JAVA11/알고리즘] 5-5 쇠막대기 (0) | 2022.08.24 |