코딩테스트 연습/SWEA
[SWEA] 1486. 장훈이의 높은 선반 D4
수기
2022. 11. 12. 16:10
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV2b7Yf6ABcBBASw
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
dfs, 완탐으로 쉽게 풀 수 있는 문제였다.
부분집합을 사용해서 B 이상인 것 중 가장 작은 것을 찾아 출력했다.
그런데..runtime error가 났다...
더보기
문제 자체는 쉽게 풀었는데.. Runtime Error가 나길래 무슨 문제인가 봤더니..
StringTokenizer를 테스트케이스 반복문 안에 써줘야하는데, T = Integer.parseInt(br.readLine()); 바로 밑에써줘서 났던 오류.
이런 실수는 하지말자!!ㅜㅜ
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Solution {
static int T, N, B;
static int inp[];
static int min, ans;
static int src[];
static boolean select[];
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
T = Integer.parseInt(br.readLine());
for (int t = 1; t <= T; t++) {
StringTokenizer st = new StringTokenizer(br.readLine());
min = Integer.MAX_VALUE;
N = Integer.parseInt(st.nextToken());
B = Integer.parseInt(st.nextToken()); // 선반의 높이
st = new StringTokenizer(br.readLine());
inp = new int[N];
select = new boolean[N];
for (int i = 0; i < N; i++) {
inp[i] = Integer.parseInt(st.nextToken());
}
// 탑의 높이가 B이상인 것 중에서 가장 작은 출력
// dfs로 모든 합이 될 수 있는 경우의 수를 만든다.(완탐) 그중에서 B이상인 제일 작은 것 출력
subset(0, 0);
System.out.println("#" + t + " " + (min-B));
} // testcase
}
static void subset(int srcIdx, int sum) {
if(sum >= B) min = Math.min(min, sum);
if(srcIdx == N) return;
select[srcIdx] = true;
subset(srcIdx + 1, sum + inp[srcIdx]);
select[srcIdx] = false;
subset(srcIdx + 1, sum);
}
}