4 ๋ถ„ ์†Œ์š”

๐Ÿ“ [SW_1767] ํ”„๋กœ์„ธ์„œ ์—ฐ๊ฒฐํ•˜๊ธฐ

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

public class Solution {
	static StringTokenizer st;
	static int[][] map;
	static ArrayList<int[]> list;
	static int N, max, totalCnt, min;
	static int[] dy = { -1, 1, 0, 0 };
	static int[] dx = { 0, 0, -1, 1 };

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

		// ํ…Œ์ผ€
		int t = Integer.parseInt(br.readLine());

		for (int tc = 1; tc <= t; tc++) {
			sb.append("#").append(tc).append(" ");

			// ๋ฐฐ์—ด ํฌ๊ธฐ
			N = Integer.parseInt(br.readLine());

			// ์ „์ฒด ์ฝ”์–ด ๋ฆฌ์ŠคํŠธ
			map = new int[N][N];

			// ๊ฐ€์žฅ์ž๋ฆฌ๋ฅผ ์ œ์™ธํ•œ ์ฝ”์–ด ๋ฆฌ์ŠคํŠธ
			list = new ArrayList<int[]>();

			// ์ตœ๋Œ€ ์—ฐ๊ฒฐ ์ฝ”์–ด์ˆ˜
			max = 0;

			// ์ตœ์†Œ ์ „์„  ๊ธธ์ด์˜ ํ•ฉ
			min = Integer.MAX_VALUE;

			// ๊ฐ€์žฅ์ž๋ฆฌ๊ฐ€ ์•„๋‹Œ ์ฝ”์–ด์˜ ๊ฐœ์ˆ˜
			totalCnt = 0;

			// ์ž…๋ ฅ
			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());

					// ๊ฐ€์žฅ ์ž๋ฆฌ์— ์žˆ๋Š” ๊ฒƒ์€ ํ†ต๊ณผ ( ์–ด์ฐจํ”ผ ์—ฐ๊ฒฐ์ด ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ™•์ธํ•  ํ•„์š” x -> ์‹œ๊ฐ„๋ณต์žก๋„ ๊ฐ์†Œ )
					if ((i == 0 || i == N - 1 || j == 0 || j == N - 1) && map[i][j] == 1)
						continue;

					// ๊ฐ€์žฅ ์ž๋ฆฌ์— ์žˆ๋Š” ์ฝ”์–ด๊ฐ€ ์•„๋‹ˆ๋ฉด list์— ์ถ”๊ฐ€
					if (map[i][j] == 1) {
						list.add(new int[] { i, j });
						// ๊ฐœ์ˆ˜ ์ถ”๊ฐ€
						totalCnt++;
					}
				}
			}

			go(0, 0);

			sb.append(min).append("\n");
		}
		System.out.println(sb);
	}

	// ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ์ฝ”์–ด ์ „์„ ๋†“๊ธฐ ์‹œ๋„ , cCnt : ์ „์›๊ณผ ์—ฐ๊ฒฐ๋œ ์ฝ”์–ด ์ˆ˜
	private static void go(int index, int cCnt) {

		// ๊ธฐ์ €์กฐ๊ฑด - ๋ชจ๋“  ์ฝ”์–ด๋ฅผ ์‹œ๋„ํ•ด๋ณธ ๊ฒฝ์šฐ
		if (index == totalCnt) {
			int res = getLength();
			// ํ˜„์žฌ ์—ฐ๊ฒฐ๋œ ์ฝ”์–ด์ˆ˜๊ฐ€ ๋” ๋งŽ๋‹ค๋ฉด ์ตœ๋Œ€ ์ฝ”์–ด์ˆ˜์™€ ์ตœ์†Œ ์ „์„  ๊ธธ์ด ํ•ฉ์„ ๋ฐ”๊ฟ”์ค€๋‹ค.
			if (max < cCnt) {
				max = cCnt;
				min = res;
			} else if (max == cCnt) { // ์ตœ๋Œ€ ์—ฐ๊ฒฐ ์ฝ”์–ด์ˆ˜๊ฐ€ ๊ฐ™๋‹ค๋ฉด ๋” ์ตœ์†Œ์ธ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พผ๋‹ค
				if (min > res)
					min = res;
			}
			return;
		}

		// ์ฒ˜๋ฆฌํ•ด์•ผํ•  ์ฝ”์–ด
		int[] core = list.get(index);
		int y = core[0];
		int x = core[1];

		// ์ „์„  ๋†“์•„๋ณด๊ธฐ ( 4๋ฐฉํ–ฅ์œผ๋กœ )
		for (int i = 0; i < 4; i++) {
			// ๋†“์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธ x,y ์œ„์น˜์—์„œ i ๋ฐฉํ–ฅ์œผ๋กœ ๋†“์„ ์ˆ˜ ์žˆ์œผ๋ฉด
			if (isAvailable(y, x, i)) {
				// ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ ( ์ „์„  ๋†“๊ธฐ ) -> 0 ์€ ๋นˆ์ž๋ฆฌ 1 ์€ ์ฝ”์–ด ์ž๋ฆฌ 2 ๋Š” ์ „์„  ์ž๋ฆฌ
				setStatus(y, x, i, 2);
				// ๋‹ค์Œ core๋กœ ์ด๋™
				go(index + 1, cCnt + 1);
				// ์ฒ˜์Œ์— ์œ„๋ฐฉํ–ฅ์œผ๋กœ ๋‘๊ณ  ๋‹ค ๊ฐ”๋‹ค์™”์œผ๋‹ˆ ์ด์ œ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๋‘๊ณ  ๋‹ค ๋Œ๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ ๋นˆ์ž๋ฆฌ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค. ์ „์„  ์ง€์šฐ๊ธฐ
				// ๋ฐฑํŠธ๋ž˜ํ‚น
				setStatus(y, x, i, 0);

			}
		}

		// ์ „์„  ๋†“์ง€ ์•Š๊ธฐ , ์นด์šดํŠธ ๋ณ€ํ™”๋Š” ์—†๋‹ค
		go(index + 1, cCnt);

	}

	// r, c ์œ„์น˜์—์„œ d ๋ฐฉํ–ฅ์œผ๋กœ ์ „์„ ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์ฒดํฌ
	private static boolean isAvailable(int y, int x, int i) {
		int nx = x;
		int ny = y;
		
		while (true) {
			nx += dx[i];
			ny += dy[i];

			// ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ
			if (nx < 0 || nx >= N || ny < 0 || ny >= N)
				break;

			// ๋‹ค๋ฅธ ์ฝ”์–ด๋‚˜ ์ „์„ ์„ ๋งŒ๋‚˜๋ฉด return false ( 1, 2 ์ธ ๊ฒฝ์šฐ )
			if(map[ny][nx] >= 1) return false;
		}
		// ๋‹ค๋ฅธ์• ๋“ค ์•ˆ๋งŒ๋‚˜๊ณ  ๋๊นŒ์ง€ ๋‹ค๊ฐ€์„œ ์™„๋ฃŒ
		return true;		
	}

	// r,c ์œ„์น˜์—์„œ d ๋ฐฉํ–ฅ์œผ๋กœ ์ „์„ ์„ ๋†“๊ฑฐ๋‚˜(2) ์ง€์šฐ๊ฑฐ๋‚˜(0) -> s ๋Š” ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ผ๊ฑฐ์ž„
	private static void setStatus(int y, int x, int i, int s) {
		int nx = x;
		int ny = y;

		// ๋ฐฉํ–ฅ ํƒ์ƒ‰
		while (true) {
			// ์ฝ”์–ด์œ„์น˜๋Š” ๊ฑด๋“ค์ง€ ์•Š๋Š”๋‹ค. ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ๊ณ„์† ๊ฐ„๋‹ค ( while ๋ฌธ )
			nx += dx[i];
			ny += dy[i];

			// ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ
			if (nx < 0 || nx >= N || ny < 0 || ny >= N)
				break;

			// ์•ˆ๊ทธ๋Ÿฌ๋ฉด map ์— ์ƒํƒœ๊ฐ’์œผ๋กœ ์ฑ„์šด๋‹ค
			map[ny][nx] = s;
		}
	}

	// ๋†“์•„์ง„ ์ „์„ ์˜ ๊ธธ์ด์˜ ํ•ฉ ๊ณ„์‚ฐ
	private static int getLength() {
		int lCnt = 0;
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				// ์ „์„ ์ผ ๊ฒฝ์šฐ
				if (map[i][j] == 2)
					lCnt++;
			}
		}
		return lCnt;
	}

}

๐Ÿค” ๋‚˜์˜ ์ƒ๊ฐ

์ผ๋‹จ ๋ชจ๋“  ๋ฌธ์žฅ์— ์ฃผ์„์„ ๋‹ฌ์•„ ๋ณด์•˜๋‹ค.
๋จผ์ € ๋ฌธ์ œ๋ฅผ ๋ณด๋ฉด ๋ถ€๋ถ„ ๋ฌธ์ œ๋“ค์ด ์žˆ๋‹ค.

  1. ๊ฐ€์žฅ์ž๋ฆฌ ์ฝ”์–ด๋Š” ์ด๋ฏธ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ
  2. ์ „์„ ์€ ์ง์„ ์œผ๋กœ ๋‚˜๊ฐ„๋‹ค.
  3. ์ „์„ ๋ผ๋ฆฌ ๊ต์ฐจํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
  4. ์ตœ๋Œ€ํ•œ ๋งŽ์€ core์— ์ „์›์„ ์—ฐ๊ฒฐํ•˜์˜€์„ ๊ฒฝ์šฐ ์ „์„  ๊ธธ์ด์˜ ํ•ฉ์„ ๊ตฌํ•˜๋ผ ( ์—ฌ๋Ÿฌ ๊ฒฝ์šฐ๊ฐ€ ๋‚˜์˜ฌ ์‹œ ํ•ฉ์ด ์ตœ์†Œ๊ฐ€ ๋˜๋Š” ๊ฒƒ )
  5. 7 <= N <= 12 ์ด๊ณ  1 <= core <= 12 ์ด๋‹ค. ์ด ์กฐ๊ฑด์„ ๊ฐ€์ง€๊ณ  ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๋จผ์ € 1๋ฒˆ์„ ํ†ตํ•ด ๊ฐ€์žฅ์ž๋ฆฌ์˜ core ๋“ค์€ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ์งˆ ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋œ๋‹ค.
    ๊ทธ๋ž˜์„œ list์— core์˜ ์ขŒํ‘œ๋ฅผ ์ €์žฅํ•  ๋•Œ ๊ฐ€์žฅ์ž๋ฆฌ core ๋“ค์€ ๋นผ์ฃผ์—ˆ๋‹ค.
    ๊ทธ๋ฆฌ๊ณ  core๋ฅผ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด๋ณด๋ฉด core ๊ฐ€ 5๊ฐœ ์ผ ๊ฒฝ์šฐ 5C1, 5C2, 5C3 โ€ฆ 5C5 ์ด๋ ‡๊ฒŒ ์ง„ํ–‰๋œ๋‹ค. ์ด ๊ณผ์ •์„ ๋‹ค ๋”ํ•˜๋ฉด ๊ฒฐ๊ตญ ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋ถ€๋ถ„์ง‘ํ•ฉ ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•œ๋‹ค.
    ์—ฌ๊ธฐ์„œ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์ƒ๊ฐํ•˜๋ฉด ๋ถ€๋ถ„์ง‘ํ•ฉ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๋Š” ๋ณดํ†ต O(2โฟ)์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์„œ๋Š” ์ƒ,ํ•˜,์ขŒ,์šฐ,๋ฏธํฌํ•จ ๊นŒ์ง€ 5๊ฐ€์ง€ ๊ฒฝ์šฐ์ด๊ธฐ ๋•Œ๋ฌธ์— O(5โฟ)์ผ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ !! ์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ์ž๋ฆฌ core๋ฅผ ์ œ์™ธํ•˜๊ณ  3๋ฒˆ ๋ฌธ์ œ์™€ ๊ฐ™์ด ๋‚˜์ค‘์— ์ „์„ ๋“ค์ด ํ•˜๋‚˜ ๋‘˜ ์”ฉ ๊ทธ์ด๊ณ  ๋‚˜๋ฉด ๋ชป๊ฐ€๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ์ด ์ƒ๊ธธ ๊ฒƒ์ด๋‹ค.
    ๊ทธ๋Ÿฌ๋ฉด ๋Œ€๋žต O(4โฟ)์ด๋ผ ์ƒ๊ฐํ•˜๋ฉด n์˜ ์ตœ๋Œ€๊ฐ’์ด 12์ด๊ธฐ ๋•Œ๋ฌธ์— 4์˜ 12์Šน์€ ์ถฉ๋ถ„ํžˆ ํ•ด๋‚ผ ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„ ๋ณต์žก๋„์ด๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ํ‹€๋ฆฌ์ง€ ์•Š์•˜๋‹ค.
    ๊ทธ๋ฆฌ๊ณ  ํ•„์š”ํ•œ ๊ฒƒ์„ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋ถ€๋ถ„์ง‘ํ•ฉ์œผ๋กœ ์ฝ”์–ด ์ „์„  ๋†“๊ธฐ, ์ „์„  ๋†“์„์ˆ˜ ์žˆ๋Š”์ง€ ์ฒดํฌ, ๋ฐฐ์—ด์— ์ƒํƒœ ์ €์žฅ, ๋†“์•„์ง„ ์ „์„  ๊ธธ์ด์˜ ํ•ฉ ๋ฉ”์„œ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
    ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์„œ core์—์„œ 4๋ฐฉํ–ฅ ( ์ƒ,ํ•˜,์ขŒ,์šฐ )์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ๋„ ๋„ฃ์–ด์ค€๋‹ค.
    ์ž์„ธํ•œ ๊ฒƒ์€ ์ฃผ์„์—๋‹ค ๋‹ค ๋‹ฌ์•„๋‘์—ˆ๋‹ค.