๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/BruteForce

[SWEA] 3234๋ฒˆ ์ค€ํ™˜์ด์˜ ์–‘ํŒ”์ €์šธ(java)

์ ์ด 2021. 8. 20. 14:46
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

SWEA(SW Expert Academy) 3234๋ฒˆ ์ค€ํ™˜์ด์˜ ์–‘ํŒ”์ €์šธ [D4]

ํ’€์ด

์–‘ํŒ”์ €์šธ์— ์˜ฌ๋ฆฌ๋Š” ์ˆœ์„œ ์ •ํ•˜๊ธฐ => ์ˆœ์—ด

์–ด๋Š์ชฝ์— ์˜ฌ๋ฆด์ง€ ์ •ํ•˜๊ธฐ => ๋ถ€๋ถ„์ง‘ํ•ฉ

๋ฌด๊ฒŒ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ์šฐ์„  ์˜ฌ๋ ค๋†“์„ ์ˆœ์„œ๋ฅผ ์ •ํ•จ.

sorted๋ฐฐ์—ด์— ์‹คํ–‰์™„๋ฃŒ ๋œ ์ˆœ์—ด์„ ์ €์žฅํ•˜๋ฉฐ, ์ˆœ์—ด์ด ์™„์„ฑ๋˜์—ˆ์„ ๊ฒฝ์šฐ(cnt==N) ์–ด๋Š์ชฝ์— ์˜ฌ๋ฆด์ง€ ์ •ํ•จ.

ํ˜„์žฌ ์ถ”๋ฅผ ์˜ค๋ฅธ์ชฝ์— ์˜ฌ๋ฆฌ๋Š” ๊ฒฝ์šฐ, ์™ผ์ชฝ์— ์˜ฌ๋ฆฌ๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ฐ๊ฐ ์‹คํ–‰.

์‹คํ–‰๋„์ค‘ left<right์ผ ๊ฒฝ์šฐ, ๊ฐ€์ง€์น˜๊ธฐ๋ฅผ ํ†ตํ•ด ์‹œ๊ฐ„์„ ๋‹จ์ถ• (๋ฐฑํŠธ๋ž˜ํ‚น)

๊ธฐ์ €์กฐ๊ฑด์„ ๋งŒ์กฑํ•œ ๊ฒฝ์šฐ, ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ ํ›„ ์ข…๋ฃŒ

์ฝ”๋“œ

import java.io.*;
import java.util.*;

public class Solution{
	static int N, res;
	static int[] weight,sorted;
	static boolean[] isSelected;
	
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int tc = Integer.parseInt(br.readLine());
		for(int T = 1 ; T<=tc ; T++) {
			N = Integer.parseInt(br.readLine());
			weight = new int[N];
			sorted = new int[N];
			isSelected = new boolean[N];
			
			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
			for(int i =0 ; i < N ; i++) {
				weight[i] = Integer.parseInt(st.nextToken());
			}
			
			res = 0;
			perm(0);
			
			sb.append("#").append(T).append(" ").append(res).append("\n");
		}
		System.out.println(sb.toString());
		br.close();
	}
	
	//์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ ๊ด€๊ณ„์—†์ด ์˜ฌ๋ ค๋†“๋Š” ์ˆœ์„œ๋ฅผ ์ •ํ•˜๋Š” '์ˆœ์—ด'ํ•จ์ˆ˜
	private static void perm(int cnt) {
		if(cnt == N) {		//๊ธฐ์ €์กฐ๊ฑด
			scale(0,0,0);
		}
		//์ˆœ์—ด ๋งŒ๋“ค๊ธฐ
		for(int i = 0 ; i < N ; i++) {
			if(isSelected[i]) continue;
			sorted[cnt] = weight[i];		//sorted: ์ˆœ์—ด๊ฒฐ๊ณผ๋ฅผ ์ €์žฅ(์ธ๋ฑ์Šค ์ €์žฅ์ด ์•„๋‹Œ ๊ฐ’ ์ €์žฅ)
			isSelected[i] = true;	// ํ˜„์žฌ ์ธ๋ฑ์Šค ์„ ํƒ์ฒ˜๋ฆฌ
			perm(cnt+1);	
			isSelected[i] = false;	// ์„ ํƒ ์ฒ˜๋ฆฌ ์ดˆ๊ธฐํ™”
		}
	}
	
	//์ˆœ์—ดํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ์ด์šฉํ•ด์„œ ์–‘ํŒ”์ €์šธ์— ์˜ฌ๋ฆด ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” '๋ถ€๋ถ„์ง‘ํ•ฉ'ํ•จ์ˆ˜
	private static void scale(int cnt, int left, int right) {
		if(left<right) return;		//๊ฐ€์ง€์น˜๊ธฐ(ํ˜„์žฌ ์™ผ์ชฝ์˜ ๋ฌด๊ฒŒ๋ณด๋‹ค ์˜ค๋ฅธ์ชฝ์˜ ๋ฌด๊ฒŒ๊ฐ€ ๋งŽ์„ ๋•Œ)
		if(cnt == N) {		//๊ธฐ์ €์กฐ๊ฑด
			res++;		//๊ฒฝ์šฐ์˜ ์ˆ˜ ์ฆ๊ฐ€
			return;
		}
		scale(cnt+1, left, right+sorted[cnt]);		//์˜ค๋ฅธ์ชฝ์— ์˜ฌ๋ ธ์„ ๋•Œ
		scale(cnt+1, left+sorted[cnt], right);		//์™ผ์ชฝ์— ์˜ฌ๋ ธ์„ ๋•Œ
	}
}
๋ฐ˜์‘ํ˜•