๋ฐ์ํ
๋ฌธ์
SWEA(SW Expert Academy) 4012๋ฒ- [๋ชจ์ SW ์ญ๋ํ ์คํธ]์๋ฆฌ์ฌ
๋ฐฑ์ค 14889๋ฒ-์คํํธ์ ๋งํฌ
https://www.acmicpc.net/problem/14889
ํ์ด
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);
}
}
๋ฐ์ํ
'๐ ์๊ณ ๋ฆฌ์ฆ > BruteForce' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 6987๋ฒ ์๋์ปต(Java) (0) | 2022.02.08 |
---|---|
[SWEA] 3234๋ฒ ์คํ์ด์ ์ํ์ ์ธ(java) (0) | 2021.08.20 |
[๋ฐฑ์ค] 2961๋ฒ ๋์์ด๊ฐ ๋ง๋ ๋ง์๋ ์์ (0) | 2021.08.17 |
[๋ฐฑ์ค]17281๋ฒ โพ(์ผ๊ตฌ) (0) | 2021.08.17 |
[SWEA] 6808๋ฒ ๊ท์์ด์ ์ธ์์ด์ ์นด๋๊ฒ์(java) (0) | 2021.08.13 |