
https://www.acmicpc.net/problem/14620
์์ ์
๋ ฅ
6
1 0 2 3 3 4
1 1 1 1 1 1
0 0 1 1 1 1
3 9 9 0 1 99
9 11 3 1 0 3
12 3 0 0 0 1
์์ ์ถ๋ ฅ
12
N๊ณผ arr 2์ฐจ์ ๋ฐฐ์ด์ ํ๋จ ๊ฐ๊ฒฉ ์
๋ ฅ ๋ฐ๊ธฐ
int N = sc.nextInt();
int[][] arr = new int[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
arr[i][j] = sc.nextInt();
}
}
์ด๋ฏธ ๊ฝ์ ์ฌ์ ์๋ฆฌ์๋ ๊ฝ์ ์ฌ์ ์ ์์ผ๋ฏ๋ก, ๊ฝ์ ์ฌ์ ์๋ฆฌ๋ฅผ ํ์ํ๊ธฐ ์ํ 2์ฐจ์ ๋ฐฐ์ด visited๋ฅผ ์์ฑํ๋ค.
boolean ๋ฐฐ์ด๋ก ์์ฑํ์ฌ ๊ฝ์ ์ฌ์์ผ๋ฉด true, ์ฌ์ง ์์์ผ๋ฉด false๋ก ๋ํ๋ธ๋ค.
boolean[][] visited = new boolean[N][N];
๋งค์ฐ ํฐ ๊ฐ์ผ๋ก ์ด๊ธฐํ
int minPrice = 100000;
์ธ ๊ฐ์ ๊ฝ์ ์ฌ๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์ ํ์ โ ์ผ์ค for๋ฌธ (์ค์ ๋ก๋ 2์ฐจ์ ๋ฐฐ์ด์ด๋ฏ๋ก 6์ค for๋ฌธ ๋๋)
๊ฝ์ ์ฌ์ ๋:
canPlant ๋ฉ์๋๋ก ํด๋น ์์น์ ์ฌ์ ์ ์๋์ง ๊ฒ์ฌ
์ฌ์ ์ ์์ผ๋ฉด visited๋ฅผ true๋ก ๋ณ๊ฒฝ
๋ค์ ๊ฝ ํ์ ํ, ํ์์ด ๋๋๋ฉด false๋ก ๋ณต๊ตฌ (๋ฐฑํธ๋ํน)
// ์ธ ๊ฐ์ ์จ์์ ์ฌ๊ธฐ ์ํ 2์ฐจ์ ๋ฐฐ์ด ์ผ์ค for
for (int i = 1; i < N - 1; i++) {
for (int j = 1; j < N - 1; j++) {
// ๊ฝ์ ์ฌ์ ์ ์๋ค๋ฉด continue
if (!canPlant(i, j, visited, N))
continue;
// ๊ฝ์ ์ฌ์ ์๋ฆฌ๋ visited ๋ฐฐ์ด์ true ํด์ฃผ๊ธฐ
visited[i][j] = true;
visited[i + 1][j] = true;
visited[i - 1][j] = true;
visited[i][j + 1] = true;
visited[i][j - 1] = true;
//...
//๋ณต๊ตฌ
visited[i][j] = false;
visited[i + 1][j] = false;
visited[i - 1][j] = false;
visited[i][j + 1] = false;
visited[i][j - 1] = false;
๊ฝ์ด ํผ๋ ์๋ฆฌ๋ฅผ ํ์ํ๊ธฐ ์ํด ๋ธํ๋ฅผ ์ด์ฉํด์ ํด๋น ์๋ฆฌ๋ฅผ ํ์ํ๋ค.
๊ฝ์ด ์ฐจ์งํ 5์นธ์ด ๋ฒ์ ๋ฐ์ด๊ฑฐ๋, ์ด๋ฏธ ๋ค๋ฅธ ๊ฝ์ด ์ฌ๊ฒจ ์์ผ๋ฉด false.
// ๊ฝ ์ฌ๋ ๋ฒ์ -> ๋ธํ๋ฅผ ํ์ฉํ ์ด๋
static int[] di = { 0, 1, -1, 0, 0 };
static int[] dj = { 0, 0, 0, 1, -1 };
// ๊ฝ์ ์ฌ์ ์ ์๋์ง ๊ฒ์ฌ
private static boolean canPlant(int x, int y, boolean[][] visited, int N) {
for (int k = 0; k < 5; k++) {
int nx = x + di[k];
int ny = y + dj[k];
// ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด ์๋๋ค.
if (nx < 0 || nx >= N || ny < 0 || ny >= N)
return false;
// ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๊ณณ์ด๋ฉด ์๋๋ค.
if (visited[nx][ny])
return false;
}
return true;
}
์ค์ฌ๊ณผ ์ํ์ข์ฐ 4์นธ์ ๊ฐ๊ฒฉ์ ํฉ์ฐ
// ๊ฝ์ ๊ฐ๊ฒฉ ๊ตฌํ๊ธฐ
private static int plantCost(int x, int y, int[][] arr) {
int sum = 0;
for (int k = 0; k < 5; k++) {
sum += arr[x + di[k]][y + dj[k]];
}
return sum;
}
์ธ ๋ฒ์งธ ๊ฝ์ ์ฌ์์ ๋ ์ด ๋น์ฉ ๊ณ์ฐ ํ minPrice ๊ฐฑ์
// 3๊ฐ์ ์จ์ ๊ฐ ๊ตฌํ๊ธฐ
int cost = plantCost(i, j, arr) + plantCost(x, y, arr) + plantCost(r, c, arr);
//ํ์ฌ ๊ฐ๊ฒฉ vs minPrice ์ค์ ์ต์๊ฐ ๊ตฌํ๊ธฐ ์
๋ฐ์ดํธํ๊ธฐ
minPrice = Math.min(minPrice, cost);
package algorithmstudy;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.Scanner;
public class ๊ฝ๊ธธ {
// ๊ฝ ์ฌ๋ ๋ฒ์ -> ๋ธํ๋ฅผ ํ์ฉํ ์ด๋
static int[] di = { 0, 1, -1, 0, 0 };
static int[] dj = { 0, 0, 0, 1, -1 };
// ๊ฝ์ ์ฌ์ ์ ์๋์ง ๊ฒ์ฌ
private static boolean canPlant(int x, int y, boolean[][] visited, int N) {
for (int k = 0; k < 5; k++) {
int nx = x + di[k];
int ny = y + dj[k];
// ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด ์๋๋ค.
if (nx < 0 || nx >= N || ny < 0 || ny >= N)
return false;
// ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๊ณณ์ด๋ฉด ์๋๋ค.
if (visited[nx][ny])
return false;
}
return true;
}
// ๊ฝ์ ๊ฐ๊ฒฉ ๊ตฌํ๊ธฐ
private static int plantCost(int x, int y, int[][] arr) {
int sum = 0;
for (int k = 0; k < 5; k++) {
sum += arr[x + di[k]][y + dj[k]];
}
return sum;
}
public static void main(String[] args) throws FileNotFoundException {
System.setIn(new FileInputStream("algorithmstudy/src/input.txt"));
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[][] arr = new int[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
arr[i][j] = sc.nextInt();
}
}
// ์ด๋ฏธ ์ฌ์ ์๋ฆฌ๋ฅผ ํ์ํ๊ธฐ ์ํ visited ๋ฐฐ์ด
// boolean ๋ฐฐ์ด์ ๊ธฐ๋ณธ๊ฐ์ false
boolean[][] visited = new boolean[N][N];
// ์ต์๊ฐ๊ฒฉ์ ์ ์ฅํ๊ธฐ ์ํ ๋ณ์
// ์ด๊ธฐ๊ฐ์ ์์ฃผ ํฐ ์๋ก ์ง์ ํ๊ธฐ
int minPrice = 100000;
// ์ธ ๊ฐ์ ์จ์์ ์ฌ๊ธฐ ์ํ 2์ฐจ์ ๋ฐฐ์ด ์ผ์ค for
for (int i = 1; i < N - 1; i++) {
for (int j = 1; j < N - 1; j++) {
// ๊ฝ์ ์ฌ์ ์ ์๋ค๋ฉด continue
if (!canPlant(i, j, visited, N))
continue;
// ๊ฝ์ ์ฌ์ ์๋ฆฌ๋ visited ๋ฐฐ์ด์ true ํด์ฃผ๊ธฐ
visited[i][j] = true;
visited[i + 1][j] = true;
visited[i - 1][j] = true;
visited[i][j + 1] = true;
visited[i][j - 1] = true;
for (int x = 1; x < N - 1; x++) {
for (int y = 1; y < N - 1; y++) {
// ๊ฝ์ ์ฌ์ ์ ์๋ค๋ฉด continue
if (!canPlant(x, y, visited, N))
continue;
// ๊ฝ์ ์ฌ์ ์๋ฆฌ๋ visited ๋ฐฐ์ด์ true ํด์ฃผ๊ธฐ
visited[x][y] = true;
visited[x + 1][y] = true;
visited[x - 1][y] = true;
visited[x][y + 1] = true;
visited[x][y - 1] = true;
for (int r = 1; r < N - 1; r++) {
for (int c = 1; c < N - 1; c++) {
// ๊ฝ์ ์ฌ์ ์ ์๋ค๋ฉด continue
if (!canPlant(r, c, visited, N))
continue;
// ๊ฝ์ ์ฌ์ ์๋ฆฌ๋ visited ๋ฐฐ์ด์ true ํด์ฃผ๊ธฐ
visited[r][c] = true;
visited[r + 1][c] = true;
visited[r - 1][c] = true;
visited[r][c + 1] = true;
visited[r][c - 1] = true;
// 3๊ฐ์ ์จ์ ๊ฐ ๊ตฌํ๊ธฐ
int cost = plantCost(i, j, arr) + plantCost(x, y, arr) + plantCost(r, c, arr);
//ํ์ฌ ๊ฐ๊ฒฉ vs minPrice ์ค์ ์ต์๊ฐ ๊ตฌํ๊ธฐ ์
๋ฐ์ดํธํ๊ธฐ
minPrice = Math.min(minPrice, cost);
//์ธ๋ฒ์งธ ๊ฝ ๋ณต๊ตฌ
visited[r][c] = false;
visited[r + 1][c] = false;
visited[r - 1][c] = false;
visited[r][c + 1] = false;
visited[r][c - 1] = false;
}
}
//๋๋ฒ์งธ ๊ฝ ๋ณต๊ตฌ
visited[x][y] = false;
visited[x + 1][y] = false;
visited[x - 1][y] = false;
visited[x][y + 1] = false;
visited[x][y - 1] = false;
}
}
visited[i][j] = false;
visited[i + 1][j] = false;
visited[i - 1][j] = false;
visited[i][j + 1] = false;
visited[i][j - 1] = false;
}
}
System.out.println(minPrice);
}
}