๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 9944_NxM ๋ณด๋“œ ์™„์ฃผํ•˜๊ธฐ

๋ฟŒ์•ผ._. 2023. 6. 1. 14:31

Gold III

๋ฌธ์ œ(์ถœ์ฒ˜: https://www.acmicpc.net/problem/9944)

< NxM ๋ณด๋“œ ์™„์ฃผํ•˜๊ธฐ >

 

๋ฌธ์ œ ํ’€์ด

 

์ด๋™ํ•˜๋ ค๋Š” ๊ณณ์„ ๋ฏธ๋ฆฌ ํ™•์ธํ•œ ํ›„ ๋ณด๋“œ ๋ฒ”์œ„ ๋ฐ–์ด๊ฑฐ๋‚˜ ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๊ณณ์ด๋ผ๋ฉด ๋ฐฉํ–ฅ์„ ๋ฐ”๊พธ๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค.

 

์ข…๋ฃŒ ์กฐ๊ฑด์„ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š”๊ฐ€ ๊ณ ๋ฏผํ–ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” visited ๋ฐฐ์—ด์„ ์ด์šฉํ•ด์„œ ๋ฐ˜๋ณต๋ฌธ์„ ํ™œ์šฉํ•ด์„œ ํ™•์ธํ•˜๋ ค๋‹ค๊ฐ€ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ ๊ฐ™์•„ ๋”ฐ๋กœ ๋ณ€์ˆ˜๋ฅผ ๋‘์–ด ๊ฐœ์ˆ˜๋กœ ๋‹ค ๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€ ํ™•์ธํ–ˆ๋‹ค. 

 

 

 

 my solution (Java)

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

public class _9944_ { // NxM ๋ณด๋“œ ์™„์ฃผํ•˜๊ธฐ
	static int arr[][], n, m, min_result;
	static boolean visited[][];
	static int dx[] = { -1, 1, 0, 0 }; // ์ƒํ•˜์ขŒ์šฐ
	static int dy[] = { 0, 0, -1, 1 };

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

		int num = 1;
		String input="";
		while ((input = bf.readLine())!= null) {
			st=new StringTokenizer(input);
			n = Integer.parseInt(st.nextToken()); // ์„ธ๋กœ ํฌ๊ธฐ
			m = Integer.parseInt(st.nextToken()); // ๊ฐ€๋กœ ํฌ๊ธฐ
			
			arr = new int[n][m];
			visited = new boolean[n][m];
			min_result = -1;
			int result = 1;
			int cnt = 1; // ๋ฐฉ๋ฌธ ๊ฐœ์ˆ˜

			for (int i = 0; i < n; i++) {
				String str = bf.readLine();
				for (int j = 0; j < m; j++) {
					char c = str.charAt(j);
					arr[i][j] = c;
					if (c == '*') {
						cnt += 1;
						visited[i][j] = true;
					}
				}
			}

			if(cnt== n*m) min_result=0; // ํ•œ ์นธ๋งŒ ๋นˆ ์นธ์ด๋ผ๋ฉด
			
			for (int i = 0; i < n; i++) {
				for (int j = 0; j < m; j++) {
					if (!visited[i][j]) {
						for (int k = 0; k < 4; k++) {
							if(i+dx[k]>=0 && i+dx[k]<n && j+dy[k]>=0 && j+dy[k]<m && !visited[i+dx[k]][j+dy[k]]) { // ์ด๋™ ๊ฐ€๋Šฅ & ๋ฐฉ๋ฌธ x
								visited[i][j] = true;
								search(i, j, result, k, cnt);
								visited[i][j] = false;
							}	
						}
					}
				}
			}
			System.out.println("Case " + num + ": " + min_result);
			num += 1;
		}
	}

	private static void search(int i, int j, int result, int direct, int cnt) {

		if (cnt == n * m) { // ๋ชจ๋“  ๋นˆ ์นธ ๋ฐฉ๋ฌธ
			if (min_result == -1 || min_result > result) {
				min_result = result;
				return;
			}
		}

		int x = i + dx[direct];
		int y = j + dy[direct];
		
		if (x >= 0 && x < n && y >= 0 && y < m && !visited[x][y]) { // ๋ณด๋“œ ๋ฒ”์œ„ ์•ˆ & ๋ฐฉ๋ฌธ x
			visited[x][y] = true;
			search(x, y, result, direct, cnt + 1);
			visited[x][y] = false;
		} else { // ๋ฐฉํ–ฅ ๋ณ€๊ฒฝ
			for (int k = 0; k < 4; k++) { 
				if (k == direct) 
					continue;
				int a = i + dx[k];
				int b = j + dy[k];
				if (a >= 0 && a < n && b >= 0 && b < m && !visited[a][b]) { // ๋ณด๋“œ ๋ฒ”์œ„ ์•ˆ & ๋ฐฉ๋ฌธ x
					visited[a][b] = true;
					search(a, b, result + 1, k, cnt + 1);
					visited[a][b] = false;
				}
			}
		}
	}
}

 

Main

- ์„ธ๋กœ ํฌ๊ธฐ(n), ๊ฐ€๋กœ ํฌ๊ธฐ(m) ์ž…๋ ฅ

- arr : ๋ณด๋“œ ์ƒํƒœ ์ €์žฅ

  visited : ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ์ €์žฅ

  min_result : ์ตœ์†Œ ์ด๋™ ํšŸ์ˆ˜

  result : ์ด๋™ ํšŸ์ˆ˜

  cnt : ๋ฐฉ๋ฌธ ๊ฐœ์ˆ˜

- ๋ณด๋“œ ์ƒํƒœ ์ž…๋ ฅ๋ฐ›์œผ๋ฉฐ ์žฅ์• ๋ฌผ์ด ์žˆ๋Š” ๊ณณ์€ cnt +1 ๋ฐ ๋ฐฉ๋ฌธ ํ‘œ์‹œ

- ํ•œ ์นธ๋งŒ ๋นˆ์นธ์ด๋ผ๋ฉด min_result=0

  ex) 3 3

        ***
        *.*

        ***

-  arr๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉฐ ๋นˆ์นธ์ด๋ฉฐ ์ด๋™ํ•  ๊ณณ์ด ๋ณด๋“œ ๋ฒ”์œ„ ์•ˆ์ด๊ณ  ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ณณ์ด๋ฉด ๋ฐฉ๋ฌธ ํ‘œ์‹œ ๋ฐ search ํ•จ์ˆ˜ ํ˜ธ์ถœ

- min_result ์ถœ๋ ฅ

 

search(x์ขŒํ‘œ, y ์ขŒํ‘œ, ์ด๋™ ํšŸ์ˆ˜, ๋ฐฉํ–ฅ ๋ฒˆํ˜ธ, ๋ฐฉ๋ฌธ ๊ฐœ์ˆ˜)

- ์ข…๋ฃŒ ์กฐ๊ฑด : ๋ชจ๋“  ๋นˆ์นธ์„ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋ฉด min_result ๊ฐ’์„ ์ตœ์†Œ ์ด๋™ ํšŸ์ˆ˜๋กœ ์—…๋ฐ์ดํŠธํ•œ ํ›„ ์ข…๋ฃŒ

- ๋ฐฉํ–ฅ์— ๋งž๊ฒŒ ์ด๋™ํ•œ ํ›„ ๋ณด๋“œ ๋ฒ”์œ„ ์•ˆ์ด๋ฉฐ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด -> ๊ทธ ๋ฐฉํ–ฅ์œผ๋กœ ๊ณ„์† ์ด๋™ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ ๋ฐฉ๋ฌธ ํ‘œ์‹œ ๋ฐ search ํ•จ์ˆ˜ ํ˜ธ์ถœ (cnt๋งŒ 1 ์ฆ๊ฐ€)

- ๋ณด๋“œ ๋ฒ”์œ„ ์•ˆ์ด ์•„๋‹ˆ๊ฑฐ๋‚˜ ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๊ณณ์ด๋ผ๋ฉด ๋ฐฉํ–ฅ์„ ๋ฐ”๊ฟ”์•ผ ํ•จ -> ๋ฐฉํ–ฅ์„ ๋ฐ”๊ฟ”์„œ ์ด๋™ํ•  ์œ„์น˜๊ฐ€ ๋ณด๋“œ ๋ฒ”์œ„ ์•ˆ์ด๊ณ  ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋ฐฉ๋ฌธ ํ‘œ์‹œ ๋ฐ search ํ•จ์ˆ˜ ํ˜ธ์ถœ (๋ฐฉํ–ฅ์„ ๋ฐ”๊ฟจ์œผ๋ฏ€๋กœ result๋ฅผ 1 ์ฆ๊ฐ€ ๋ฐ cnt 1 ์ฆ๊ฐ€)

 


๋งˆ๋ฌด๋ฆฌ๐Ÿค”

 

NullPointer ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ด์„œ ์„ค๋งˆ ํ•˜๊ณ  ์ž…๋ ฅ์„ ๋ฐ›๋Š” ๋ถ€๋ถ„์„ ์ฐพ์•„๋ณด๋‹ˆ EOF์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.