코딩테스트 연습/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);
		
	}

}