05-16 14:15
Recent Posts
Recent Comments
๊ด€๋ฆฌ ๋ฉ”๋‰ด

miinsun

[Algorithm]์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž๋ฐ”_70 ํ”ผ์ž ๋ฐฐ๋‹ฌ ๊ฑฐ๋ฆฌ : DFS ๋ณธ๋ฌธ

Algorithm/Java

[Algorithm]์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž๋ฐ”_70 ํ”ผ์ž ๋ฐฐ๋‹ฌ ๊ฑฐ๋ฆฌ : DFS

miinsun 2022. 3. 9. 00:18

๐Ÿ’ฌ ๋ฌธ์ œ ์„ค๋ช…

N×N ํฌ๊ธฐ์˜ ๋„์‹œ์ง€๋„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„์‹œ์ง€๋„๋Š” 1×1ํฌ๊ธฐ์˜ ๊ฒฉ์ž์นธ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ ๊ฒฉ์ž์นธ์—๋Š” 0์€ ๋นˆ์นธ, 1์€ ์ง‘, 2๋Š” ํ”ผ์ž์ง‘์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. ๊ฐ ๊ฒฉ์ž์นธ์€ ์ขŒํ‘œ(ํ–‰๋ฒˆํ˜ธ, ์—ด ๋ฒˆํ˜ธ)๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.
ํ–‰๋ฒˆํ˜ธ๋Š” 1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ๊นŒ์ง€์ด๊ณ , ์—ด ๋ฒˆํ˜ธ๋„ 1๋ถ€ํ„ฐ N๊นŒ์ง€์ž…๋‹ˆ๋‹ค.

๋„์‹œ์—๋Š” ๊ฐ ์ง‘๋งˆ๋‹ค “ํ”ผ์ž๋ฐฐ๋‹ฌ๊ฑฐ๋ฆฌ”๊ฐ€ ์•˜๋Š”๋ฐ ๊ฐ ์ง‘์˜ ํ”ผ์ž๋ฐฐ๋‹ฌ๊ฑฐ๋ฆฌ๋Š” ํ•ด๋‹น ์ง‘๊ณผ ๋„์‹œ์˜ ์กด์žฌํ•˜๋Š” ํ”ผ์ž์ง‘๋“ค๊ณผ์˜ ๊ฑฐ๋ฆฌ ์ค‘ ์ตœ์†Œ๊ฐ’์„ ํ•ด๋‹น ์ง‘์˜ “ํ”ผ์ž๋ฐฐ๋‹ฌ๊ฑฐ๋ฆฌ”๋ผ๊ณ  ํ•œ๋‹ค. ์ง‘๊ณผ ํ”ผ์ž์ง‘์˜ ํ”ผ์ž๋ฐฐ๋‹ฌ๊ฑฐ๋ฆฌ๋Š” |x1-x2|+|y1-y2| ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋„์‹œ์˜ ์ง€๋„๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค๋ฉด
(1, 2)์— ์žˆ๋Š” ์ง‘๊ณผ (2, 3)์— ์žˆ๋Š” ํ”ผ์ž์ง‘๊ณผ์˜ ํ”ผ์ž ๋ฐฐ๋‹ฌ ๊ฑฐ๋ฆฌ๋Š” |1-2| + |2-3| = 2๊ฐ€ ๋œ๋‹ค.

์ตœ๊ทผ ๋„์‹œ๊ฐ€ ๋ถˆ๊ฒฝ๊ธฐ์— ์ ‘์–ด๋“ค์–ด ์šฐํ›„์ฃฝ์ˆœ ์ƒ๊ฒผ๋˜ ํ”ผ์ž์ง‘๋“ค์ด ํŒŒ์‚ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋„์‹œ ์‹œ์žฅ์€ ๋„์‹œ์— ์žˆ๋Š” ํ”ผ์ž์ง‘ ์ค‘ M๊ฐœ๋งŒ ์‚ด๋ฆฌ๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋ณด์กฐ๊ธˆ์„ ์ฃผ๊ณ  ํ์—…์‹œํ‚ค๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

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

 

๐Ÿ”จ ์ž…์ถœ๋ ฅ ์˜ˆ

- ์ž…๋ ฅ 

  • ์ฒซ์งธ ์ค„์— N(2 ≤ N ≤ 50)๊ณผ M(1 ≤ M ≤ 12)์ด ์ฃผ์–ด์ง„๋‹ค.
  • ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ ๋„์‹œ ์ •๋ณด๊ฐ€ ์ž…๋ ฅ๋œ๋‹ค.
4 4
0 1 2 0
1 0 2 1
0 2 1 2
2 0 1 2

 

- ์ถœ๋ ฅ

  • ์ฒซ์งธ ์ค„์— M๊ฐœ์˜ ํ”ผ์ž์ง‘์ด ์„ ํƒ๋˜์—ˆ์„ ๋•Œ ๋„์‹œ์˜ ์ตœ์†Œ ํ”ผ์ž๋ฐฐ๋‹ฌ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
6

 

 

๐Ÿ’ป Solution.java

/* ํ”ผ์ž ๋ฐฐ๋‹ฌ ๊ฑฐ๋ฆฌ :: DFS */

import java.util.*;

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

public class Main {
	static int n, m, len, answer = Integer.MAX_VALUE;
	static int[] combi;
	static ArrayList<Point> pz, hs;
	
	public void DFS(int L, int s) {
		//ํ”ผ์ž์ง‘์„ m๊ฐœ๋งŒํผ ์„ ํƒ
		if(L == m) {
			int sum = 0;
			
			// ์ง‘๋“ค์„ ํ•˜๋‚˜์”ฉ ๋‚˜์—ด
			for(Point h : hs) {
				int dis = Integer.MAX_VALUE;
				for(int i : combi) {
					dis = Math.min(dis, Math.abs(h.x - pz.get(i).x) + Math.abs(h.y - pz.get(i).y));
				}
				sum += dis;
			}
			answer = Math.min(sum, answer);
		}
		else {
			for(int i = s; i < len; i++) {
				combi[L] = i;
				DFS(L+1, i+1);
			}
		}
 	}
	
	public static void main(String[] args){
		Main main = new Main();
		Scanner sc = new Scanner(System.in);

		n = sc.nextInt();
		m = sc.nextInt();
		pz = new ArrayList<>();
		hs = new ArrayList<>();
		
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < n; j++) {
				int tmp = sc.nextInt();
				
				//์ขŒํ‘œ๊ฐ€ 1์ด๋ฉด hs์— ์ €์žฅ, 2๋ฉด pz์— ์ €์žฅ
				if(tmp == 1) hs.add(new Point(i, j));
				else if(tmp == 2) pz.add(new Point(i, j));
			}
		}
		len = pz.size();
		combi = new int[m];
		
		main.DFS(0, 0);
		System.out.println(answer);
		sc.close();
		return ;
	}
}

 

Comments