๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

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


1. ๋ฌธ์ œ

NxNํฌ๊ธฐ์˜ map์— ๋Šฅ๋ ฅ์น˜ ํฌ๊ธฐ๊ฐ€ ์“ฐ์—ฌ์žˆ๋‹ค. N๋ช… ์ค‘ N/2๋ช…์œผ๋กœ ๊ฐ๊ฐ 2๊ฐœ์˜ ํŒ€์„ ๋งŒ๋“ค์—ˆ์„ ๋•Œ

๊ฐ ํŒ€์ด ๊ฐ€์ง€๋Š” ๋Šฅ๋ ฅ์น˜์˜ ์ฐจ์ด๊ฐ€ ์ตœ์†Œ๊ฐ€ ๋  ๋•Œ์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

๋Šฅ๋ ฅ์น˜๋Š” ๊ฐ ํŒ€์˜ ํŒ€์› ๋ฒˆํ˜ธ์— ๋”ฐ๋ผ ๊ฒฐ์ •๋œ๋‹ค.

ํŒ€์›์ด 1, 2, 3์ผ ๊ฒฝ์šฐ

map[1][2] + map[2][1] + map[1][3] + map[3][1] + map[2][3] + map[3][2]

๊ฐ€ ๋Šฅ๋ ฅ์น˜๊ฐ€ ๋œ๋‹ค.

2. ํ’€์ด

์กฐํ•ฉ์œผ๋กœ ํ’€์—ˆ๋‹ค.

์กฐํ•ฉ์œผ๋กœ ํŒ€1์˜ ๊ตฌ์„ฑ์›์„ ์ •ํ•˜์˜€๋‹ค. ์ด ๋•Œ visited๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒ€1๋กœ ์ง€์ •๋œ ๋ฒˆํ˜ธ๋Š” true๋กœ ๋ฐฉ๋ฌธํ‘œ์‹œํ•˜์˜€๊ณ 

comb๊ฐ€ ๋๋‚˜๋ฉด ๋‹ค์‹œ false๋กœ ์›๋ณต์‹œ์ผœ์ฃผ์—ˆ๋‹ค.

ํŒ€2๋Š” visited๊ฐ€ false์ธ ์ˆซ์ž๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ๋Šฅ๋ ฅ์น˜๋ฅผ ๊ตฌํ•œ ํ›„

ํŒ€1์˜ ๋Šฅ๋ ฅ์น˜์™€ ํŒ€2์˜ ๋Šฅ๋ ฅ์น˜ ์ฐจ์ด ์ ˆ๋Œ“๊ฐ’์œผ๋กœ ๋งค๋ฒˆ ์ตœ์†Ÿ๊ฐ’์„ ๊ฐฑ์‹ ํ•ด์ฃผ์–ด ๋‹ต์„ ๊ตฌํ•˜์˜€๋‹ค.

 

3. ์ฝ”๋“œ

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

public class Main {
    
	static int N, map[][], ans, tgt[], tgt2[];
	static boolean visited[];
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		
		N = Integer.parseInt(br.readLine());
		
		map = new int[N][N];
		tgt = new int[N/2];
		visited = new boolean[N];
		
		for (int i=0; i<N; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j=0; j<N; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		// ์ž…๋ ฅ ๋
		
		ans = Integer.MAX_VALUE;
		comb(0, 0);
		System.out.println(ans);
	}
	
	static void comb(int tgtIdx, int start) {
		if (tgtIdx == N/2) {
			check();
			return;
		}
		for (int i=start; i<N; i++) {
			tgt[tgtIdx] = i;
			visited[i] = true;
			comb(tgtIdx+1, i+1);
			visited[i] = false;
		}
	}
	
	static void check() {
		int sum = 0;
		for (int i=0; i<N/2; i++) {
			for (int j=0; j<N/2; j++) {
				if (i==j) continue;
				int y = tgt[i];
				int x = tgt[j];
				sum += map[y][x];
			}
		}
		
		tgt2 = new int[N/2];
		int idx = 0;
		for (int i=0; i<N; i++) {
			if (visited[i]) continue;
			tgt2[idx] = i;
			idx++;
		}
		
		int sum2 = 0;
		for (int i=0; i<N/2; i++) {
			for (int j=0; j<N/2; j++) {
				if (i==j) continue;
				int y = tgt2[i];
				int x = tgt2[j];
				sum2 += map[y][x];
			}
		}

		int res = Math.abs(sum - sum2);
		ans = Math.min(ans, res);
	}
}

4. ์‚ฌ๋‹ด

์กฐํ•ฉ ๋ฌธ์ œ๋Š” ๋ญ”๊ฐ€ ๊ฒŒ์ž„๊ฐ™๋‹ค.