2 ๋ถ„ ์†Œ์š”

๐Ÿ“ [SW_2105] ๋””์ €ํŠธ ์นดํŽ˜

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

public class Solution {
	static int N;
	static int[][] map;
	static int dx[] = { 1, -1, -1, 1 };
	static int dy[] = { 1, 1, -1, -1 };
	static boolean[][] v;
	static boolean[] dessert;
	static int max;

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

		int tc = Integer.parseInt(br.readLine());

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

			// ํ•œ ๋ณ€์˜ ๊ธธ์ด
			N = Integer.parseInt(br.readLine());
			map = new int[N][N];
			max = 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());
				}
			}

			// ์–‘์˜†๊ณผ ๋ฐ‘์— 2์นธ์ด ์žˆ์–ด์•ผ ์‚ฌ๊ฐํ˜•์ด ๊ฐ€๋Šฅ ์„œ์น˜
			for (int i = 0; i < N - 2; i++) {
				for (int j = 1; j < N - 1; j++) {
					v = new boolean[N][N];
					// ๋””์ €ํŠธ ์ข…๋ฅ˜
					dessert = new boolean[101];
					// ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
					v[i][j] = true;
					// ๋””์ €ํŠธ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ
					dessert[map[i][j]] = true;
					dfs(1, i, j, i, j, 0);
				}
			}
			if (max == 0) {
				sb.append("-1").append("\n");
			} else {
				sb.append(max).append("\n");
			}
		}
		System.out.println(sb);
	}

	// dfs - prevD๋Š” ์ด์ „๋ฐฉํ–ฅ
	static void dfs(int cnt, int y, int x, int initY, int initX, int prevD) {
		for (int i = prevD; i < 4; i++) {
			int ny = y + dy[i];
			int nx = x + dx[i];

			// ๋ฒ”์œ„์— ๋ฒ—์–ด๋‚˜์ง€ ์•Š์œผ๋ฉด
			if (ny >= 0 && ny < N && nx >= 0 && nx < N) {
				// ์ดˆ๊ธฐ ์ƒํƒœ๋กœ ๋Œ์•„์™”์„ ๋•Œ ์ข…๋ฃŒ ( ๊ธฐ์ €์กฐ๊ฑด )
				if ((ny == initY) && (nx == initX) && cnt > 2) {
					max = Math.max(max, cnt);
					return;
					// ์ข…๋ฃŒ
				}
				// ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ณณ์ด๋ฉด
				if(!v[ny][nx] && !dessert[map[ny][nx]]) {
					// ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
					v[ny][nx] = true;
					dessert[map[ny][nx]] = true;
					dfs(cnt + 1, ny,nx,initY,initX,i);
					// ๋ฐฑํŠธ๋ž˜ํ‚น
					v[ny][nx] = false;
					dessert[map[ny][nx]] = false;
				}
			}
		}
	}
}

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

์ฒ˜์Œ์—” ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ž˜๋ชปํ–ˆ๋‹ค..
์Šคํ„ฐ๋””์—์„œ ํ‘ผ ๊ฒƒ์ธ๋ฐ ์ •์‚ฌ๊ฐํ˜• ํƒ์ƒ‰๊ณผ ์ง์‚ฌ๊ฐํ˜• ํƒ์ƒ‰์„ ๋‚˜๋ˆ ์„œ ์ƒ๊ฐํ•˜๋ฉฐ ๋จธ๋ฆฌ๋ฅผ ํŒฝ๊ธ€๋Œ๋ฆฌ๋ฉฐ ์ƒ๊ฐํ–ˆ์ง€๋งŒ ๋ชปํ’€์–ด์„œ..
์Šคํ„ฐ๋””์›๋“ค์˜ ์„ค๋ช…์„ ๋“ค์„๋•Œ dfs๋ฅผ ๋“ฃ์ž๋งˆ์ž ์•„..! ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค..
๊ทธ๋ž˜์„œ ์‚ฌ๊ฐํ˜•์„ ๋ฒ—์–ด๋‚˜๋Š” ๋ฒ”์œ„๋ฅผ ์ œ์™ธํ•˜๊ณ  ์™„์ „ ํƒ์ƒ‰์œผ๋กœ ๋ชจ๋“  ์ ์—์„œ์˜ ์ถœ๋ฐœ๋กœ ํ•˜์—ฌ ์‚ฌ๊ฐํ˜•์„ ๋งŒ๋“ค์—ˆ๋‹ค.
dfs ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์›€์ง์ธ ํšŸ์ˆ˜, ์ขŒํ‘œ, ์ดˆ๊ธฐ์ขŒํ‘œ, ์ด์ „ ๋ฐฉํ–ฅ ์„ ์ฒดํฌํ•ด์„œ ์ดˆ๊ธฐ์ขŒํ‘œ๋กœ ์™”์„ ๋•Œ ๋์„ ๋‚ด๊ณ  ๋ฐฉํ–ฅ์€ ์ „์— ๋ฐฉํ–ฅ์— ๊ฐ€์ง€ ๋ชปํ•˜๊ฒŒ for๋ฌธ์„ ๊ตฌ์„ฑํ–ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  dfs๋ฅผ ํ†ตํ•ด ์ตœ๋Œ€ ๋””์ €ํŠธ ์ข…๋ฅ˜๋ฅผ ๊ตฌํ•ด ์ถœ๋ ฅํ•ด ์ฃผ์—ˆ๋‹ค.
๋ญ”๊ฐ€ ์˜ค๋žœ๋งŒ์— ํ’€๋‹ค๋ณด๋‹ˆ ์—ฌ๋Ÿฌ ์ƒ๊ฐ์„ ๋ชปํ•œ ๊ฒƒ๊ฐ™๋‹ค.. ํ‹€๋ฆฐ ๊ฒƒ ๊ฐ™์œผ๋ฉด ๋น ๋ฅด๊ฒŒ ๋‹ค์–‘ํ•œ ์ƒ๊ฐ์„ ํ•˜์ž !!