📌 문제 설명
철수는 시장에 가기 위해 트럭에 바둑이들을 태우려고 한다.
하지만 트럭은 최대 C kg까지만 적재 가능하며
총 N마리 바둑이들의 무게가 주어질 때
C를 넘지 않으면서 태울 수 있는 최대 무게를 구하는 프로그램을 작성하라.
📝 입력 & 출력
입력
- 첫 줄: 트럭의 허용 무게 C (1 ≤ C ≤ 100,000,000), 바둑이 수 N (1 ≤ N ≤ 30)
- 둘째 줄부터: N마리 바둑이의 무게가 한 줄에 하나씩 주어진다.
출력
- 첫 줄: 트럭에 태울 수 있는 가장 무거운 무게
🔹 예제 입력 & 출력
예제 입력
259 5
81
58
42
33
61
예제 출력
242
💡 해결 방법
✅ 접근 방법
- 가능한 모든 바둑이 조합을 부분집합 형태로 탐색한다.
- DFS를 이용해 각 바둑이를 태우거나 태우지 않는 두 가지 경우로 분기
- 누적된 무게 sum이 C를 초과하지 않으면서 최대가 되는 값을 추적
✅ 가지치기 가능
- 바둑이 수 N이 최대 30이므로 모든 조합은 2^30 ≈ 10^9
- 단순 DFS만으론 시간 초과 가능성 있음
- 가지치기 조건을 넣어 탐색을 줄이면 효과적임 (sum > C일 경우 조기 종료 등)
💻 코드 구현 (Java)
package partDfsBfs;
import java.util.*;
public class Problem2 {
static int C, N;
static int[] arr;
static int answer = 0;
public void DFS(int L, int sum) {
if (sum > C) return; // ❗ 가지치기: 이미 용량 초과 시 중단
if (L == N) {
answer = Math.max(answer, sum);
} else {
DFS(L + 1, sum + arr[L]); // 현재 바둑이를 태움
DFS(L + 1, sum); // 현재 바둑이를 태우지 않음
}
}
public static void main(String[] args) {
Problem2 T = new Problem2();
Scanner kb = new Scanner(System.in);
C = kb.nextInt();
N = kb.nextInt();
arr = new int[N];
for (int i = 0; i < N; i++) arr[i] = kb.nextInt();
T.DFS(0, 0);
System.out.println(answer);
kb.close();
}
}
📖 코드 설명
1️⃣ 입력 및 초기화
C = kb.nextInt();
N = kb.nextInt();
arr = new int[N];
- 트럭 최대 적재 무게와 바둑이 수 입력
2️⃣ DFS 함수
public void DFS(int L, int sum)
- L: 현재 인덱스
- sum: 현재까지 태운 바둑이 무게의 합
3️⃣ 가지치기 (최적화)
if (sum > C) return;
- 이미 허용 무게를 초과했다면 더 이상 탐색할 필요 없음
4️⃣ 종료 조건
if (L == N) answer = Math.max(answer, sum);
- 바둑이 N마리 모두 확인했을 경우 최대 무게 갱신
5️⃣ 포함 / 미포함 분기
DFS(L + 1, sum + arr[L]);
DFS(L + 1, sum);
- 현재 바둑이를 태우는 경우와 태우지 않는 경우로 분기
⏳ 시간 복잡도 분석
- 전체 경우의 수: 2^N → N=30이면 약 10억 개
- 가지치기 없을 때: 최악의 경우 O(2^30)
- 가지치기 적용 시,평균 탐색 횟수는 훨씬 감소
🧠 핵심 정리
- 조합 문제에서 최대/최소 값을 구할 땐 DFS가 효과적
- sum > C일 때 가지치기(Pruning) 를 적용해 탐색 시간을 줄일 수 있음
- 완전탐색으로 충분히 풀 수 있는 범위 내에서는
부분집합 구성 + 조건 필터링 방식이 직관적이고 구현이 간결함
출처: 인프런 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
https://www.inflearn.com/course/자바-알고리즘-문제풀이-코테대비/dashboard
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 강의 | 김태원 - 인프런
김태원 | , 자바(Java) 알고리즘 문제풀이 채점사이트를 통해 기초부터 준비해보세요! 💪 [사진] 이 강의는 [사진] 자바(Java)로 코딩테스트 준비를 하고 계신 분께 추천드려요! 문제는 기초~ 중급
www.inflearn.com
'코딩테스트 > 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비' 카테고리의 다른 글
| 섹션 8 DFS, BFS - 4. 중복순열 구하기 (1) | 2025.05.06 |
|---|---|
| 섹션 8 DFS, BFS - 3. 최대점수 구하기(DFS) (1) | 2025.05.06 |
| 섹션 8 DFS, BFS - 1. 합이 같은 부분집합(DFS : 아마존 인터뷰) (0) | 2025.05.02 |
| 섹션 7 Recursive, Tree, Graph - 14. 그래프최단거리(BFS) (0) | 2025.05.02 |
| 섹션 7 Recursive, Tree, Graph - 12. 경로탐색 (인접리스트) (0) | 2025.04.30 |