1 λΆ„ μ†Œμš”

πŸ“ [S2_2961] λ„μ˜μ΄κ°€ λ§Œλ“  λ§›μžˆλŠ” μŒμ‹

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;


public class Main {
	static StringTokenizer st;
	// 뢀뢄집합 ν•©μ—μ„œ 체크
	static boolean[] isChecked;
	// 신맛, 쓴맛 λ°°μ—΄
	static int[] S, B;
	// 재료의 개수
	static int N;
	static int res = Integer.MAX_VALUE;
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();

		// 재료의 개수
		N = Integer.parseInt(br.readLine());

		// 신맛 λ°°μ—΄
		S = new int[N];
		// 쓴맛 λ°°μ—΄
		B = new int[N];

		// 뢀뢄집합 ν•©μ—μ„œ 체크
		isChecked = new boolean[N];

		// μž…λ ₯
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			// 재료의 신맛 S -> *
			S[i] = Integer.parseInt(st.nextToken());
			// 재료의 쓴맛 B -> +
			B[i] = Integer.parseInt(st.nextToken());
		}
		
		go(0);
		
		sb.append(res);
		System.out.println(sb);

	}

	// 뢀뢄집합 ν•©
	static void go(int start) {
		int S_sum = 1;
		int B_sum = 0;
		int minus = 0;
		int cnt =0;
		// 기저쑰건
		if (start == N) {
			// true λ©΄ 계산을 ν•œλ‹€
			for (int i = 0; i < N; i++) {
				if (isChecked[i]) {
					cnt++;
					S_sum *= S[i];
					B_sum += B[i];
				}
				else {
					continue;
				}
			}
			if(cnt == 0) {
				return;
			}
			minus = Math.abs(S_sum - B_sum);
			res = Math.min(minus, res);
			return;
		}

		isChecked[start] = true;
		go(start + 1);

		isChecked[start] = false;
		go(start + 1);
	}
}

πŸ€” λ‚˜μ˜ 생각

이 λ¬Έμ œλŠ” λΆ€λΆ„ 집합 합을 톡해 μ‰½κ²Œ ν’€ 수 μžˆμ—ˆλ‹€.
κ·ΈλŸ¬λ‚˜ κ³΅μ§‘ν•©μ˜ μ›μ†Œλ“€ λ•Œλ¬Έμ— μ•½κ°„ 버벅이긴 ν–ˆλ‹€.