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

https://www.acmicpc.net/problem/15686

 

15686๋ฒˆ: ์น˜ํ‚จ ๋ฐฐ๋‹ฌ

ํฌ๊ธฐ๊ฐ€ N×N์ธ ๋„์‹œ๊ฐ€ ์žˆ๋‹ค. ๋„์‹œ๋Š” 1×1ํฌ๊ธฐ์˜ ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ๋„์‹œ์˜ ๊ฐ ์นธ์€ ๋นˆ ์นธ, ์น˜ํ‚จ์ง‘, ์ง‘ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๋„์‹œ์˜ ์นธ์€ (r, c)์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋‚ด๊ณ , rํ–‰ c์—ด ๋˜๋Š” ์œ„์—์„œ๋ถ€ํ„ฐ r๋ฒˆ์งธ ์นธ

www.acmicpc.net


1. ๋ฌธ์ œ ์š”์•ฝ

NxN ํฌ๊ธฐ์˜ ๋„์‹œ์— ์น˜ํ‚จ์ง‘, ์ง‘์ด ์žˆ๋‹ค. ์ง‘์—์„œ ์น˜ํ‚จ์ง‘๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ '์น˜ํ‚จ๊ฑฐ๋ฆฌ'๋ผ๊ณ  ํ•œ๋‹ค.

์น˜ํ‚จ์ง‘ ์ „์ฒด ์ˆ˜ ์ค‘ M๊ฐœ๋ฅผ ์„ ํƒํ•˜์—ฌ ๊ฐ๊ฐ์˜ ์ง‘์— ๋Œ€ํ•˜์—ฌ ์ตœ์†Œ๊ฐ€ ๋˜๋Š” ์น˜ํ‚จ๊ฑฐ๋ฆฌ์˜ ํ•ฉ์„ ๊ตฌํ•˜์—ฌ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ๋‹ค.

 

๊ฐ๊ฐ์˜ ์ง‘๋งˆ๋‹ค ์ตœ์†Œ๊ฐ€ ๋˜๋Š” ์น˜ํ‚จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๊ณ , ์ด๋ฅผ ๋ชจ๋‘ ํ•ฉํ•˜๋ฉด ๋œ๋‹ค.

๊ฑฐ๋ฆฌ๋Š” (a,b) (c,d) ๋‘ ์นธ์„ ์˜ˆ๋กœ๋“ค๋ฉด |a-b| + |c-d| ๋กœ ๊ตฌํ•œ๋‹ค. (๋งจํ•˜ํƒ„ ๊ฑฐ๋ฆฌ ๊ณต์‹)

0 : ๋นˆ์นธ

1 : ์ง‘

2 : ์น˜ํ‚จ์ง‘

์ œ์•ฝ์กฐ๊ฑด์€ (M <= ์น˜ํ‚จ์ง‘ <= 13), (2 <= N <= 50),  (์ง‘ <= 2N) ์ด๋‹ค.

 

2. ํ’€์ด

์กฐํ•ฉ + ๊ตฌํ˜„ ๋ฌธ์ œ์ด๋‹ค.

1. ์ž…๋ ฅ

๋จผ์ € ์ž…๋ ฅ๋ฐ›์„ ๋•Œ ์ขŒํ‘œ ๊ฐ’์ด 1์ด๋ฉด ์ง‘, 2์ด๋ฉด ์น˜ํ‚จ์ง‘ ArrayList์— ๊ฐ๊ฐ add ํ•ด์ฃผ์—ˆ๋‹ค.

(๊ทธ ์ „์—, x,y ์ขŒํ‘œ๋ฅผ ๋‹ด๋Š” Posํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ArrayList๋ฅผ Pos์œผ๋กœ ์ƒ์„ฑํ•ด์ฃผ์—ˆ๋‹ค.)

 

2. ์น˜ํ‚จ์ง‘ ์„ ํƒ ๋ฐ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๊ธฐ

๊ทธ ๋‹ค์Œ ์น˜ํ‚จ์ง‘ M๊ณณ์„ ์„ ํƒํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

์กฐํ•ฉ ํ•จ์ˆ˜ comb์˜ ๊ธฐ์ €์กฐ๊ฑด์—์„œ check() ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์น˜ํ‚จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๊ณ , min์„ ๊ฐฑ์‹ ํ•˜์˜€๋‹ค.

 

๋‚ด๊ฐ€ ๋†“์นœ ๋ถ€๋ถ„์€ 3๊ตฐ๋ฐ์ด๋‹ค.

1) ํ•˜๋‚˜์˜ ์ง‘ ๋‹น M๊ฐœ ์น˜ํ‚จ์ง‘๊ณผ์˜ ๊ฑฐ๋ฆฌ ์ค‘ ์ตœ์†Œ๊ฐ€ ๋˜๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ์น˜ํ‚จ๊ฑฐ๋ฆฌ๊ฐ€ ๋œ๋‹ค๋Š” ๊ฒƒ

  - ํ•˜๋‚˜์˜ ์ง‘ ๋‹น M๊ฐœ ์น˜ํ‚จ์ง‘๊ณผ์˜ ๊ฑฐ๋ฆฌ์˜ ํ•ฉ์„ ๋น„๊ตํ•ด์ฃผ๊ณ  ์žˆ์—ˆ๋‹ค. '์ตœ์†Œ๊ฐ€ ๋˜๋Š” ๊ฑฐ๋ฆฌ'๋ฅผ ๋†“์ณค๋‹ค.

2) ํ•˜๋‚˜์˜ ์ง‘ ๋‹น ์ตœ์†Œ ์น˜ํ‚จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•ด์ฃผ์–ด์•ผ ํ•˜๋ฏ€๋กœ, min ์ดˆ๊ธฐํ™”๊ฐ€ ํ•˜๋‚˜์˜ ์ง‘ for๋ฌธ ์•ˆ์—์„œ ์ดˆ๊ธฐํ™”๋ผ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ

  - min์„ for๋ฌธ ๋ฐ–์—์„œ ์ดˆ๊ธฐํ™”ํ•ด์ค˜์„œ ๋‹ค๋ฅธ์ง‘์˜ min๊ณผ๋„ ๊ณ„์† ๋น„๊ตํ•˜๋ฉด์„œ sum์„ ๊ตฌํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

3) ์น˜ํ‚จ์ง‘ M๊ฐœ๋ฅผ ๋ฝ‘๋Š”๋ฐ 2๊ฐœ๋ฅผ ๋ฝ‘๊ณ ์žˆ์—ˆ๋˜ ๊ฒƒ..

๋ฌธ์ œ๋ฅผ ํ•œ๋ฒˆ๋งŒ ์ฝ๊ณ ๋Š” ์ดํ•ดํ•  ์ˆ˜ ์—†์—ˆ๋‹ค. ์ž๊พธ ํ•˜๋‚˜์”ฉ ๋†“์ณ์„œ 4๋ฒˆ์€ ์ฝ์€ ๊ฒƒ ๊ฐ™๋‹ค.

3. ๋ฌธ์ œ์ 

์น˜ํ‚จ ๊ฑฐ๋ฆฌ์˜ mix๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ๊ฐ€์žฅ ํ—ท๊ฐˆ๋ ธ๋‹ค. 

์ฒ˜์Œ์—๋Š” M = 2๋กœ ๋ฐ•์•„๋†“๊ณ  ์กฐํ•ฉ์„ ๋Œ๋ ค์„œ ์ž๊พธ ์ด์ƒํ•œ ๋‹ต์ด ๋‚˜์™”๋‹ค.

M์œผ๋กœ ๋ฐ”๊พธ๊ณ  M๊ฐœ์˜ ์น˜ํ‚จ์ง‘๊ณผ ๋น„๊ตํ•ด์ฃผ๋‹ˆ ๋‹ต์ด ์ž˜ ๋‚˜์™”๋‹ค.

4. ์ฝ”๋“œ

๋”๋ณด๊ธฐ
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class BOJ_15686_์น˜ํ‚จ๋ฐฐ๋‹ฌ {

	static int N, M, min, size;
	static int[] tgt;
	static int[][] map;
	static List<Pos> home = new ArrayList<> ();
	static List<Pos> chicken = new ArrayList<> ();
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		
		tgt = new int[M];
		map = new int[N][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());
				if (map[i][j] == 1) home.add(new Pos(i, j)); //์ง‘ ์ขŒํ‘œ add
				if (map[i][j] == 2) chicken.add(new Pos(i, j)); //์น˜ํ‚จ์ง‘ ์ขŒํ‘œ add
			}
		} 
		size = chicken.size(); //์น˜ํ‚จ์ง‘ ๊ฐœ์ˆ˜
		//์ž…๋ ฅ ๋
		
		//ํƒ์ƒ‰ - ์กฐํ•ฉ
		min = Integer.MAX_VALUE;
		comb(0, 0);
		System.out.println(min);
	}
	
	static void comb(int tgtIdx, int srcIdx) {
		if (tgtIdx == M) { //์น˜ํ‚จ์ง‘ 2๊ณณ ์„ ํƒ
			check(); //์น˜ํ‚จ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๊ณ  min ๊ฐฑ์‹ 
			return;
		}
		
		if (srcIdx == size) return;
		
		tgt[tgtIdx] = srcIdx;
		
		comb(tgtIdx+1, srcIdx+1);
		comb(tgtIdx, srcIdx+1);
	}
	
	static void check() { //์น˜ํ‚จ๊ฑฐ๋ฆฌ
		int sum = 0;
		for (Pos h : home) {
			int min_dist = Integer.MAX_VALUE; //for๋ฌธ ๋ฐ–์— ๋„ฃ์–ด์ฃผ๋ฉด ๋‹ค๋ฅธ์ง‘๊ณผ์˜ ์ตœ์†Œ๊ฑฐ๋ฆฌ๋„ ๋น„๊ตํ•˜๊ฒŒ ๋จ
			for (int i = 0; i < M; i++) { //M๊ฐœ ์น˜ํ‚จ์ง‘ ์ค‘ ๊ฐ€์žฅ ์ตœ์†Œ๊ฑฐ๋ฆฌ ์น˜ํ‚จ์ง‘ ์ฐพ๊ธฐ
				int dist = Math.abs(chicken.get(tgt[i]).y - h.y) + Math.abs(chicken.get(tgt[i]).x - h.x);
				min_dist = Math.min(dist, min_dist); 
			}
			sum += min_dist; //๊ทธ ์ง‘์˜ ์ตœ์†Œ ๊ฑฐ๋ฆฌ๋งŒ ํ•ฉํ•ด์คŒ
		}
		min = Math.min(sum, min); //์ „์ฒด ์กฐํ•ฉ ์ค‘ ์ตœ์†Œ๊ฐ’ ๊ฐฑ์‹ 
	}
	
	static class Pos {
		int y, x;
		public Pos(int y, int x) {
			this.y = y;
			this.x = x;
		}
	}
}