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

 

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

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

www.acmicpc.net

 

 

 

 

 

 

์ผ๋…„ ์ „์— ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์Šคํ„ฐ๋””ํ•  ๋•Œ ํ’€์–ด๋ดค๋˜ ๋ฌธ์ œ์ด๋‹ค. ๊ทธ๋•Œ๋Š” ๋ชป ํ’€์–ด์„œ ํ•ด์„ค์„ ์ฐธ๊ณ ํ•ด์„œ ํ’€์—ˆ๋Š”๋ฐ, ์ด๋ฒˆ์—๋Š” ํ•ด์„ค์„ ์ฐธ๊ณ ํ•˜์ง€ ์•Š๊ณ  ์˜จ์ „ํžˆ ๋‚ด ํž˜์œผ๋กœ ํ’€์—ˆ๋‹ค. ์‹ค๋ ฅ์ด ๋Š” ๊ฑฐ ๊ฐ™์•„์„œ ๋ฟŒ๋“ฏํ–ˆ๋‹ค!

 

 

 

 

 

๋„์‹œ์— ์žˆ๋Š” ์น˜ํ‚จ์ง‘ ์ค‘์—์„œ ์ตœ๋Œ€ M๊ฐœ๋ฅผ ๊ณ ๋ฅด๊ณ , ๋‚˜๋จธ์ง€ ์น˜ํ‚จ์ง‘์€ ๋ชจ๋‘ ํ์—…์‹œ์ผœ์•ผ ํ•œ๋‹ค.

 

1. ๋ฐฐ์—ด์˜ ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›์„ ๋•Œ, ์น˜ํ‚จ์ง‘์˜ ์ขŒํ‘œ๋ฅผ ํด๋ž˜์Šค๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ ๋ฆฌ์ŠคํŠธ๋กœ ์ €์žฅํ•œ๋‹ค

2. ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ๋œ ์น˜ํ‚จ์ง‘ ์ค‘ M๊ฐœ๋ฅผ ์กฐํ•ฉ์„ ํ†ตํ•ด ๋ฝ‘๋Š”๋‹ค. ์ด๋•Œ 0๊ฐœ๋ถ€ํ„ฐ M๊ฐœ ์กฐํ•ฉ ๋ชจ๋‘์— ๋Œ€ํ•ด ์กฐํ•ฉ์„ ์‹ค์‹œํ•œ๋‹ค.

3. ์ฃผ์–ด์ง„ ์ˆ˜๋งŒํผ ๋‹ค ๋ฝ‘์•˜์œผ๋ฉด, ์„ ํƒ๋œ ์น˜ํ‚จ์ง‘์˜ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•œ๋‹ค.

- ํ•œ ์ง‘์— ๋Œ€ํ•ด ์„ ํƒ๋œ ๋ชจ๋“  ์น˜ํ‚จ ์ง‘๊ณผ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•ด ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์น˜ํ‚จ์ง‘ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•œ๋‹ค.

- ๋ชจ๋“  ์ง‘์˜ ์น˜ํ‚จ๊ฑฐ๋ฆฌ๋ฅผ ๋”ํ•œ๋‹ค

4. ์ตœ์†Ÿ๊ฐ’์„ ๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค.

 

 

 

 

 

์ƒ๊ฐํ•ด๋ณด๋‹ˆ ์กฐํ•ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— visited ๋ฐฐ์—ด์ด ํ•„์š”์—†๋‹ค. ๊ทธ๋ž˜์„œ visited ์ฒดํฌ๋ฅผ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ํ•˜์ง€๋งŒ ๋ฐฉ๋ฌธํ•œ ๊ณณ์˜ ์ธ๋ฑ์Šค๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ์ •๋ณด๋กœ๋Š” ์ผ๋‹ค.

 

 

 

 

 

์ฝ”๋“œ

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, M;
	static List<Dot> chickenList;
	static List<Dot> houseList;
	static boolean[] visited;
	static int min = Integer.MAX_VALUE;

	static class Dot {
		int x;
		int y;

		public Dot(int x, int y) {
			this.x = x;
			this.y = y;
		}
	}

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

		StringTokenizer st = new StringTokenizer(br.readLine(), " ");

		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());

		chickenList = new ArrayList<>();
		houseList = new ArrayList<>();

		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine(), " ");

			for (int j = 0; j < N; j++) {
				int value = Integer.parseInt(st.nextToken());

				if(value == 1) {
					houseList.add(new Dot(i, j));
				}else if(value == 2) {
					chickenList.add(new Dot(i, j));
				}
			}
		}

		// ๊ตฌํ˜„
		visited = new boolean[chickenList.size()];

		for (int i = 1; i <= M; i++) { // 1, 2, .., M๊ฐœ ์กฐํ•ฉ
			combination(0, 0, i);
		}

		// ์ถœ๋ ฅ
		System.out.println(min);
	}

	public static void combination(int start, int depth, int m) {
		if (depth == m) {
			min = Math.min(min, getDistance());
			return;
		}

		for(int i = start; i < chickenList.size(); i++) {
			if (visited[i]) continue;

			visited[i] = true;
			combination(i + 1, depth + 1, m);
			visited[i] = false;
		}
	}

	public static int getDistance() {
		int distanceSum = 0;
		
		for(Dot house : houseList) {
			int dMin = Integer.MAX_VALUE;
			
			for(int i = 0; i < chickenList.size(); i++) {
				if(visited[i]) { //์‚ด์•„๋‚จ์€ ์น˜ํ‚จ์ง‘์ด๋ฉด
					Dot chicken = chickenList.get(i);
					int d = Math.abs(house.x - chicken.x) + Math.abs(house.y - chicken.y);
					dMin = Math.min(dMin, d);
				}
			}
			
			distanceSum += dMin;
		}
		
		return distanceSum;
	}
}

 

 

 

 

 

 

๊ฒฐ๊ณผ

giraffe_