๋ฌธ์ (์ถ์ฒ: 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์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด์๋ค.
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 24446_์๊ณ ๋ฆฌ์ฆ ์์ - ๋๋น ์ฐ์ ํ์ 3 (1) | 2023.06.03 |
---|---|
[Baekjoon] 24447_์๊ณ ๋ฆฌ์ฆ ์์ - ๋๋น ์ฐ์ ํ์ 4 (0) | 2023.06.02 |
[Baekjoon] 23747_์๋ (0) | 2023.05.30 |
[Baekjoon] 17265_๋์ ์ธ์์๋ ์ํ๊ณผ ํจ๊ป (0) | 2023.05.30 |
[Baekjoon] 14719_๋น๋ฌผ (0) | 2023.05.29 |