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

[SWEA] 4012๋ฒˆ ์š”๋ฆฌ์‚ฌ, [๋ฐฑ์ค€] 14889๋ฒˆ ์Šคํƒ€ํŠธ์™€ ๋งํฌ

์ ์ด 2021. 8. 18. 15:10
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

SWEA(SW Expert Academy) 4012๋ฒˆ- [๋ชจ์˜ SW ์—ญ๋Ÿ‰ํ…Œ์ŠคํŠธ]์š”๋ฆฌ์‚ฌ

๋ฐฑ์ค€ 14889๋ฒˆ-์Šคํƒ€ํŠธ์™€ ๋งํฌ

https://www.acmicpc.net/problem/14889

 

14889๋ฒˆ: ์Šคํƒ€ํŠธ์™€ ๋งํฌ

์˜ˆ์ œ 2์˜ ๊ฒฝ์šฐ์— (1, 3, 6), (2, 4, 5)๋กœ ํŒ€์„ ๋‚˜๋ˆ„๋ฉด ๋˜๊ณ , ์˜ˆ์ œ 3์˜ ๊ฒฝ์šฐ์—๋Š” (1, 2, 4, 5), (3, 6, 7, 8)๋กœ ํŒ€์„ ๋‚˜๋ˆ„๋ฉด ๋œ๋‹ค.

www.acmicpc.net

ํ’€์ด

A, B์š”๋ฆฌ ๊ฐ๊ฐ ์žฌ๋ฃŒ๋ฅผ ๋ฐ˜์”ฉ ๋‚˜๋ˆ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— A์š”๋ฆฌ ์žฌ๋ฃŒ๋ฅผ ์„ ํƒํ•œ ํ›„ ๋‚จ์€ ์žฌ๋ฃŒ๋ฅผ B์š”๋ฆฌ์— ์‚ฌ์šฉ -> ์กฐํ•ฉ

A์š”๋ฆฌ์— ์„ ํƒ๋œ ์žฌ๋ฃŒ์˜ ์ •๋ณด๋Š” isSelected ๋ฐฐ์—ด์— ํ•ด๋‹น ์ธ๋ฑ์Šค๋ฅผ true๋กœ ๋ฐ”๊ฟ”์คŒ์œผ๋กœ์จ ์ €์žฅ

์กฐํ•ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๊ธฐ์ €์กฐ๊ฑด์„ ์žฌ๋ฃŒ๊ฐ€ N/2๊ฐœ ์„ ํƒ๋˜์—ˆ์„ ๋•Œ๋กœ ์ •ํ•จ

๊ธฐ์ €์กฐ๊ฑด ๋‹ฌ์„ฑ ์‹œ, ํ˜„์žฌ ์กฐํ•ฉ์œผ๋กœ ๋ง›์„ ๋น„๊ตํ•˜๋Š” compTasty๋ฉ”์†Œ๋“œ ์‹คํ–‰

ํ˜„์žฌ ์กฐํ•ฉ์—์„œ์˜ ๋ง› ์ฐจ์ด(compTasty() ๊ฒฐ๊ณผ๊ฐ’)์™€ ๊ธฐ์กด์˜ ๋ง› ์ฐจ์ด ์ค‘ ์ตœ์†Ÿ๊ฐ’(tasty) ๋น„๊ต

 

์ฝ”๋“œ

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

public class Solution{
	static int N;
	static int[][] arr;		//์‹œ๋„ˆ์ง€ ๋ฐฐ์—ด์„ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜
	static boolean[] isSelected;	//a์กฐํ•ฉ์— ์„ ํƒ๋œ ์žฌ๋ฃŒ idx: true, b์กฐํ•ฉ์— ์„ ํƒ๋œ ์žฌ๋ฃŒ idx: false
	static int tasty;	//๊ฒฐ๊ณผ ๊ฐ’(=์ตœ์†Œ ๋ง› ์ฐจ์ด)
	
	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());	//์žฌ๋ฃŒ์˜ ์ˆ˜
			arr = new int[N][N];
			for(int i =0 ; i < N ; i++) {
				StringTokenizer st = new StringTokenizer(br.readLine(), " ");
				for(int j =0 ; j < N ; j++) {
					arr[i][j] = Integer.parseInt(st.nextToken());	//์‹œ๋„ˆ์ง€ ๊ฐ’ ์ €์žฅ
				}
			}
			isSelected = new boolean[N];
			tasty = Integer.MAX_VALUE;
			comb(0,0);	
			sb.append("#").append(T).append(" ").append(tasty).append("\n");
		}
		System.out.println(sb.toString());
	}
	
	//์žฌ๋ฃŒ์˜ ์กฐํ•ฉ์„ ๊ฒฐ์ •ํ•˜๋Š” ๋ฉ”์†Œ๋“œ
	static void comb(int cnt, int start) {
		if(cnt == N/2) {	//๊ธฐ์ €์กฐ๊ฑด: ์žฌ๋ฃŒ๊ฐ€ N/2๊ฐœ ์„ ํƒ๋˜์—ˆ์„ ๋•Œ
			tasty = Math.min(tasty, compTasty());		//ํ˜„์žฌ ์กฐํ•ฉ์œผ๋กœ์˜ ๋ง› ์ฐจ์ด(compTasty()), ๊ธฐ์กด์˜ ๋ง›์ฐจ์ด(tasty) ์ค‘ ์ตœ์†Ÿ๊ฐ’ ์„ ํƒ
			return;
		}
		for(int i = start ; i < N ; i++) {		
			isSelected[i] = true;	//์„ ํƒ๋œ ์žฌ๋ฃŒ: true
			comb(cnt+1, i+1);	//๋‹ค์Œ์ž๋ฆฌ ์กฐํ•ฉ ๋ฝ‘์œผ๋Ÿฌ
			isSelected[i] = false;	//๋‹ค์Œ ์กฐํ•ฉ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ ์ดˆ๊ธฐํ™”
		}
	}
	
	static int compTasty() {
		int[] a = new int[N/2] , b = new int[N/2];		// a, b ์š”๋ฆฌ ์žฌ๋ฃŒ์˜ idx๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด
		int a_idx = 0, b_idx = 0;		
		for(int i =0 ; i < N ; i++) {
			if(isSelected[i]) a[a_idx++] = i;		//์กฐํ•ฉ์—์„œ ์„ ํƒ๋˜์—ˆ๋‹ค๋ฉด a์š”๋ฆฌ
			else b[b_idx++] = i;					//์„ ํƒ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด b์š”๋ฆฌ
		}
		int a_ts = 0, b_ts =0;		//a, b ์š”๋ฆฌ์˜ ๋ง›
		for(int i = 0 ; i < a.length ; i++) {
			for(int j = 0 ; j<a.length ; j++) {
				a_ts += arr[a[i]][a[j]];	//์š”๋ฆฌ์˜ ๊ฐ ์žฌ๋ฃŒ๊ฐ„์˜ ์‹œ๋„ˆ์ง€๋ฅผ ๋”ํ•จ
				b_ts += arr[b[i]][b[j]];	
			}
		}
		return Math.abs(a_ts - b_ts);
	}
}
๋ฐ˜์‘ํ˜•