Algorithm/λ°±μ€€

14889번 - μŠ€νƒ€νŠΈμ™€ 링크

giraffe_ 2022. 8. 16. 14:09

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

 

 

 

 

 

 

μ˜ˆμ „μ— μˆœμ—΄κ³Ό μ‘°ν•© 문제λ₯Ό μ—΄μ‹¬νžˆ ν’€ λ•Œ ν’€μ–΄λ΄€λ˜ λ¬Έμ œμ΄λ‹€. 

λ‹€μ‹œ ν’€μ—ˆλ”λ‹ˆ μ˜ˆμ „λ§Œν° μ•ˆ ν’€λ¦°λ‹€...γ…Ž

 

 

 

 

 

νŒ€μ„ 2개둜 λ‚˜λˆ μ•Ό ν•˜λ―€λ‘œ 쑰합을 μ‚¬μš©ν•˜μ—¬ nCn/2λ₯Ό ν•˜λ©΄ λœλ‹€.

그리고 κ²°κ³Όλ₯Ό visited 배열에 μ €μž₯ν•˜μ—¬ λ°©λ¬Έν•œ νŒ€μ€ μŠ€νƒ€νŠΈνŒ€, μ•Šμ€ νŒ€μ€ λ§ν¬νŒ€μœΌλ‘œ λ‚˜λˆ  점수λ₯Ό 계산해 μ£Όλ©΄ λœλ‹€.

 

쀑간에 μ‹œκ°„ μ΄ˆκ³Όκ°€ λ‚¬λŠ”λ°, μž¬κ·€λΆ€λΆ„μ—μ„œ combination(i + 1, count + 1)μ—¬μ•Ό ν•˜λŠ”λ°, iλŒ€μ‹  start둜 ν–ˆλ”λ‹ˆ ν‹€λ Έλ‹€...

 

 

 

 

 

μ½”λ“œ

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

public class Main {
	static int N;
	static int[][] arr;
	static boolean[] visited;
	static int min= Integer.MAX_VALUE;

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		N = Integer.parseInt(br.readLine());
		
		arr = new int[N + 1][N + 1];
		visited = new boolean[N + 1];
		
		for(int i = 1; i <= N; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		
			for(int j = 1; j <= N; j++) {
				arr[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		//처리
		combination(1, 0); //μ‘°ν•© : nCn/2
		
		//좜λ ₯
		System.out.println(min);
	}

	public static void combination(int start, int count) {
		if(count == N /2) {
			min = Math.min(min, difference());
			return;
		}
		
		for(int i = start; i < N + 1; i++) {
			if(visited[i] != true) {
				visited[i] = true;
				combination(i + 1, count + 1);
				visited[i] = false;
			}
		}
	}

	public static int difference() { //두 νŒ€μ˜ λŠ₯λ ₯치 차이
		int sumStart = 0;
		int sumLink = 0;
		
		for(int i = 1; i < N + 1; i++) {
			for(int j = 1; j < N + 1; j++) {
				if(visited[i] && visited[j]) //μŠ€νƒ€νŠΈνŒ€
					sumStart += arr[i][j];
				if(!visited[i] && !visited[j]) //λ§ν¬νŒ€
					sumLink += arr[i][j];
			}
		}
		
		return Math.abs(sumStart - sumLink);
	}

}

 

 

 

 

 

 

κ²°κ³Ό