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

์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€

[๋ฐฑ์ค€ ์Šคํ„ฐ๋”” 8์ฃผ์ฐจ] 14889๋ฒˆ ์Šคํƒ€ํŠธ์™€ ๋งํฌ ์‹ค๋ฒ„3 - ์ž๋ฐ”(JAVA) / ๋ฐฑํŠธ๋ž˜ํ‚น/ ๋ธŒ๋ฃจํŠธํฌ์Šค

๐Ÿ“‘ ๋ฌธ์ œ

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

๋”๋ณด๊ธฐ
๋”๋ณด๊ธฐ

๋ฌธ์ œ

์˜ค๋Š˜์€ ์Šคํƒ€ํŠธ๋งํฌ์— ๋‹ค๋‹ˆ๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋ชจ์—ฌ์„œ ์ถ•๊ตฌ๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ์ถ•๊ตฌ๋Š” ํ‰์ผ ์˜คํ›„์— ํ•˜๊ณ  ์˜๋ฌด ์ฐธ์„๋„ ์•„๋‹ˆ๋‹ค. ์ถ•๊ตฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ์ธ ์‚ฌ๋žŒ์€ ์ด N๋ช…์ด๊ณ  ์‹ ๊ธฐํ•˜๊ฒŒ๋„ N์€ ์ง์ˆ˜์ด๋‹ค. ์ด์ œ N/2๋ช…์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์Šคํƒ€ํŠธ ํŒ€๊ณผ ๋งํฌ ํŒ€์œผ๋กœ ์‚ฌ๋žŒ๋“ค์„ ๋‚˜๋ˆ ์•ผ ํ•œ๋‹ค.

BOJ๋ฅผ ์šด์˜ํ•˜๋Š” ํšŒ์‚ฌ ๋‹ต๊ฒŒ ์‚ฌ๋žŒ์—๊ฒŒ ๋ฒˆํ˜ธ๋ฅผ 1๋ถ€ํ„ฐ N๊นŒ์ง€๋กœ ๋ฐฐ์ •ํ–ˆ๊ณ , ์•„๋ž˜์™€ ๊ฐ™์€ ๋Šฅ๋ ฅ์น˜๋ฅผ ์กฐ์‚ฌํ–ˆ๋‹ค. ๋Šฅ๋ ฅ์น˜ Sij๋Š” i๋ฒˆ ์‚ฌ๋žŒ๊ณผ j๋ฒˆ ์‚ฌ๋žŒ์ด ๊ฐ™์€ ํŒ€์— ์†ํ–ˆ์„ ๋•Œ, ํŒ€์— ๋”ํ•ด์ง€๋Š” ๋Šฅ๋ ฅ์น˜์ด๋‹ค. ํŒ€์˜ ๋Šฅ๋ ฅ์น˜๋Š” ํŒ€์— ์†ํ•œ ๋ชจ๋“  ์Œ์˜ ๋Šฅ๋ ฅ์น˜ Sij์˜ ํ•ฉ์ด๋‹ค. Sij๋Š” Sji์™€ ๋‹ค๋ฅผ ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, i๋ฒˆ ์‚ฌ๋žŒ๊ณผ j๋ฒˆ ์‚ฌ๋žŒ์ด ๊ฐ™์€ ํŒ€์— ์†ํ–ˆ์„ ๋•Œ, ํŒ€์— ๋”ํ•ด์ง€๋Š” ๋Šฅ๋ ฅ์น˜๋Š” Sij์™€ Sji์ด๋‹ค.

N=4์ด๊ณ , S๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณด์ž.

i\j12341234

  1 2 3
4   5 6
7 1   2
3 4 5  

์˜ˆ๋ฅผ ๋“ค์–ด, 1, 2๋ฒˆ์ด ์Šคํƒ€ํŠธ ํŒ€, 3, 4๋ฒˆ์ด ๋งํฌ ํŒ€์— ์†ํ•œ ๊ฒฝ์šฐ์— ๋‘ ํŒ€์˜ ๋Šฅ๋ ฅ์น˜๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ์Šคํƒ€ํŠธ ํŒ€: S12 + S21 = 1 + 4 = 5
  • ๋งํฌ ํŒ€: S34 + S43 = 2 + 5 = 7

1, 3๋ฒˆ์ด ์Šคํƒ€ํŠธ ํŒ€, 2, 4๋ฒˆ์ด ๋งํฌ ํŒ€์— ์†ํ•˜๋ฉด, ๋‘ ํŒ€์˜ ๋Šฅ๋ ฅ์น˜๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ์Šคํƒ€ํŠธ ํŒ€: S13 + S31 = 2 + 7 = 9
  • ๋งํฌ ํŒ€: S24 + S42 = 6 + 4 = 10

์ถ•๊ตฌ๋ฅผ ์žฌ๋ฏธ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์Šคํƒ€ํŠธ ํŒ€์˜ ๋Šฅ๋ ฅ์น˜์™€ ๋งํฌ ํŒ€์˜ ๋Šฅ๋ ฅ์น˜์˜ ์ฐจ์ด๋ฅผ ์ตœ์†Œ๋กœ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์œ„์˜ ์˜ˆ์ œ์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” 1, 4๋ฒˆ์ด ์Šคํƒ€ํŠธ ํŒ€, 2, 3๋ฒˆ ํŒ€์ด ๋งํฌ ํŒ€์— ์†ํ•˜๋ฉด ์Šคํƒ€ํŠธ ํŒ€์˜ ๋Šฅ๋ ฅ์น˜๋Š” 6, ๋งํฌ ํŒ€์˜ ๋Šฅ๋ ฅ์น˜๋Š” 6์ด ๋˜์–ด์„œ ์ฐจ์ด๊ฐ€ 0์ด ๋˜๊ณ  ์ด ๊ฐ’์ด ์ตœ์†Œ์ด๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N(4 ≤ N ≤ 20, N์€ ์ง์ˆ˜)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— S๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ์ค„์€ N๊ฐœ์˜ ์ˆ˜๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , i๋ฒˆ ์ค„์˜ j๋ฒˆ์งธ ์ˆ˜๋Š” Sij ์ด๋‹ค. Sii๋Š” ํ•ญ์ƒ 0์ด๊ณ , ๋‚˜๋จธ์ง€ Sij๋Š” 1๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 100๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ •์ˆ˜์ด๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์Šคํƒ€ํŠธ ํŒ€๊ณผ ๋งํฌ ํŒ€์˜ ๋Šฅ๋ ฅ์น˜์˜ ์ฐจ์ด์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

 

 

 

 

 

โœ’๏ธ ํ’€์ด

 ์‚ฌ๋žŒ๋ผ๋ฆฌ์˜ ์‹œ๋„ˆ์ง€๋Š” ์ธ์ ‘ํ–‰๋ ฌ์„ ์ผ๊ณ (์‹ค๋ฒ„3์ด๋ผ ์ธ์ ‘๋ฆฌ์ŠคํŠธ๊นŒ์ง„ ํ•„์š”์—†์„ ๋“ฏํ•˜๋‹ค), ํŒ€์„ ์ •ํ•˜๋Š” ๋ถ€๋ถ„์€ ์กฐํ•ฉ์œผ๋กœ ํ’€์—ˆ๋‹ค.

 

๐Ÿ’ก boolean ํƒ€์ž…์˜ select ๋ณ€์ˆ˜๋Š” ์Šคํƒ€ํŠธํŒ€๊ณผ ๋งํฌํŒ€์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

 ์Šคํƒ€ํŠธ ํŒ€์›์ด true๊ฐ’์„, ๋งํฌ ํŒ€์›์ด false๊ฐ’์„ ๊ฐ–๋Š”๋‹ค๊ณ  ์ดํ•ดํ•˜๋ฉด ์‰ฝ๋‹ค.

 

 โœ”๏ธ ์กฐํ•ฉ์ฝ”๋“œ๋กœ ์ ˆ๋ฐ˜์„ ๋ฝ‘๋Š”๋‹ค. 

 โœ”๏ธ ์™„์ „ํƒ์ƒ‰์œผ๋กœ ์Šคํƒ€ํŠธ ํŒ€์›๋ผ๋ฆฌ/๋งํฌ ํŒ€์›๋ผ๋ฆฌ๋ฅผ ์ฐพ์•„ ์‹œ๋„ˆ์ง€๋ฅผ ํ•ฉํ•œ๋‹ค.

 ์ด๋•Œ ์ด๋ฏธ A->B๋ฅผ ์ฐพ์•„ ๋‘˜์˜ ์‹œ๋„ˆ์ง€๋ฅผ ๋”ํ–ˆ๋Š”๋ฐ, B->A๋ฅผ ์ฐพ์•„ ์ด์ค‘์œผ๋กœ ๊ณ„์‚ฐํ•˜๋Š” ์ผ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋„๋ก ์ผ๋ฐฉํ–ฅ์„ฑ์„ ์ง€ํ‚จ๋‹ค. 

 โœ”๏ธ ์ƒˆ๋กœ ๊ตฌํ•œ ํŒ€ ์‹œ๋„ˆ์ง€์˜ ์ฐจ์™€ ํ˜„์žฌ๊นŒ์ง€์˜ ๊ฒฐ๊ณผ๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ตœ์†Œ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

 โœ”๏ธ ์ค‘๊ฐ„์— 0์ด๋ผ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋ฉด, ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์ด ๋‚˜์˜จ ๊ฒƒ์ด๋ฏ€๋กœ ํƒ์ƒ‰์„ ์ข…๋ฃŒํ•œ๋‹ค.

 

 

 

 

 

 

 

 

๐Ÿ’ป ์†Œ์Šค์ฝ”๋“œ: ์ž๋ฐ”(Java)

public class Main_๋ฐฑ์ค€_14889_์Šคํƒ€ํŠธ์™€๋งํฌ_์‹ค๋ฒ„3 {
	
	static int N, result = Integer.MAX_VALUE;
	static int[][] person;
	static boolean[] select;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		person = new int[N][N];
		select = new boolean[N];
		
		for (int i = 0; i < N; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			for (int j = 0; j < N; j++) {
				person[i][j] = Integer.parseInt(st.nextToken());
			}
		}//input
		
		combination(0,0);
		System.out.println(result);
		
	}//end of main
	
	static void combination(int cnt, int start) {
		
		if(cnt==N/2) { //selection complete
			int teamStart = 0, teamLink = 0;
			
			for (int i = 0; i < N; i++) {
				for (int j = i+1; j < N; j++) {
					if(select[i]==true && select[j]==true) {
						teamStart += person[i][j];
						teamStart += person[j][i];
					}
					if(select[i]==false && select[j]==false) {
						teamLink += person[i][j];
						teamLink += person[j][i];
					}
				}
			}//synergy addition
			
			int diff = Math.abs(teamStart-teamLink);
			result = Math.min(result, diff);
			if(result==0) { //best ideal value
				System.out.println(0);
				System.exit(0);
			}
			return;
		}
		
		for (int i = start; i < N; i++) {
			select[i] = true;
			combination(cnt+1, i+1);
			select[i] = false;
		}//combination
	}//end of combination
}//end of class

 

 

 

 

 

 

 

 

๐Ÿ’Ž ๐Ÿ’Ž ๐Ÿ’Ž

 

 

๏ผฐ๏ฝ๏ฝ“๏ฝ”๏ฝ…๏ฝ„ ๏ผข๏ฝ™ ๏ผณ๏ผก๏ผน

๐˜›๐˜ฉ๐˜ข๐˜ฏ๐˜ฌ๐˜ด ๐˜ง๐˜ฐ๐˜ณ ๐˜ณ๐˜ฆ๐˜ข๐˜ฅ๐˜ช๐˜ฏ๐˜จ