1 λΆ„ μ†Œμš”

πŸ“ [S2_14889] μŠ€νƒ€νŠΈμ™€ 링크

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

 
public class Main {
	static int N;
	static int[][] arr;
	static boolean[] c;
	static int min = Integer.MAX_VALUE;
	static int res = 0;
	static List<Integer> team1;
	static List<Integer> team2;
	static int team1_sum;
	static int team2_sum;
	
	public static void main(String[] args) throws IOException{
		StringTokenizer st = null;
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		// μ‚¬λžŒ 수
		N = Integer.parseInt(br.readLine());
		
		arr = new int[N][N];
		
		// λ½‘μŒ 유무
		c = new boolean[N];
		
		// μž…λ ₯
		for(int i=0; i<N; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			for(int j=0; j<N; j++) {
				arr[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		team1 = new ArrayList<Integer>();
		team2 = new ArrayList<Integer>();
		
		comb(0,0);
		System.out.println(min);
		
	}

	// μ‘°ν•©
	static void comb(int idx, int start) {
		
		if(idx == N/2) {			
			for(int i=0; i<N; i++) {
				if(c[i]) {
					team1.add(i);
				}
				else {
					team2.add(i);
				}
			}
			
			// team1 ν•©κ΅¬ν•˜κΈ°
			for(int i=0; i<team1.size(); i++) {
				for(int j=0; j<team1.size(); j++) {
					team1_sum += arr[team1.get(i)][team1.get(j)];
				}
			}
			
			// team2 ν•©κ΅¬ν•˜κΈ°
			for(int i=0; i<team2.size(); i++) {
				for(int j=0; j<team2.size(); j++) {
					team2_sum += arr[team2.get(i)][team2.get(j)];
				}
			}
			
			// μ΅œμ†Ÿκ°’ κ΅¬ν•˜κΈ°
			min = Math.min(min, Math.abs(team1_sum - team2_sum));
			// λ‘˜λ‹€ μ΄ˆκΈ°ν™”
			team1.clear();
			team2.clear();
			team1_sum = 0;
			team2_sum = 0;
			
			return;
		}
		
		for(int i=start;i<N; i++) {
			c[i] = true;
			comb(idx+1,i+1);
			c[i] = false;
		}
	}
}

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

이 λ¬Έμ œλŠ” μˆœμ„œ 상관 없이 λͺ‡λͺ…을 λ½‘μ•„μ„œ νŒ€μ„ μ΄λ£¨λŠ” μ‘°ν•© λ¬Έμ œμ΄λ‹€.
μ²˜μŒμ— ij, ji 두 개의 합을 λ°°μ—΄λ‘œ λ”°λ‘œ λΊ„λ €κ³  μƒκ°ν–ˆμœΌλ‚˜ λ”±νžˆ 쒋은 μ•„μ΄λ””μ–΄λŠ” μ•„λ‹Œ 것 κ°™μ•„ ν†΅κ³Όν–ˆλ‹€.
그리고 이제 N λͺ…쀑에 N/2 λͺ…μ”© λ½‘μ•„μ„œ boolean에 true둜 μ €μž₯ν–ˆλ‹€.
true 된 애듀은 start νŒ€ (team1) 둜 μΉ­ν–ˆκ³  false 인 애듀은 link νŒ€ (team2) 둜 μΉ­ν–ˆλ‹€.
λ½‘μ•„μ„œ κ·Έ idxλ₯Ό list에 μ €μž₯ν•΄μ„œ κ·Έ idx 값을 가지고 배열에 μ ‘κ·Όν•΄ 값을 λ”ν•΄μ£Όμ—ˆλ‹€.
그리고 두 νŒ€ 각각의 μ„ μˆ˜λ“€μ˜ 총 합을 λΊ€ κ²°κ³Όκ°€ κ°€μž₯ μž‘μ€ 값을 좜λ ₯ν•΄μ£Όμ—ˆλ‹€.
쑰합을 μ•Œκ³  있으면 어렡지 μ•Šμ€λ° idxλ₯Ό 빼였고 더해주고 이 μž‘μ—…μ΄ μ’€ 생각이 ν•„μš”ν–ˆλ˜ 것 κ°™λ‹€.