17144๋ฒ : ๋ฏธ์ธ๋จผ์ง
Lv: ๊ณจ๋ 4
๋ฌธ์ ๋ฅผ ์์ฝํ์๋ฉด ์๋ ๊ณผ์ ์ T๋งํผ ๋ฐ๋ณตํ๋ผ๋ ๊ฒ์ด๋ค.
1. ๋ฏธ์ธ๋จผ์ง๋ฅผ ํ์ฅํ๊ณ
2. ๊ณต๊ธฐ์ฒญ์ ๊ธฐ๋ฅผ ๋๋ฆฐ๋ค.
์ด ๋ฌธ์ ๋ฅผ ์ฒ์ ๋ดค์ ๋๋
1. ๋ฏธ์ธ๋จผ์ง ํ์ฅ
๋ฏธ์ธ๋จผ์ง๋ฅผ ํ์ฅํ๋ ๊ฒ์ bfs๋ก ๋๋ฉด์ ํ๋ฉด ๋๋ค๊ณ ์๊ฐํ๊ณ ,
2. ๊ณต๊ธฐ์ฒญ์ ๊ธฐ ๋๋ฆฐ๋ค
๊ณต๊ธฐ์ฒญ์ ๊ธฐ๋ dfs๋ก ๋๋ฆฌ๋ฉด ๋๋ค๊ณ ์๊ฐํ๋ค.
๊ทธ๋ฌ๋ gpt์๊ฒ ๋ฌผ์ด๋ณด๋ ๋ ๋ค ๋ฐ๋ณต๋ฌธ์ ๋๋ฉด์ ํธ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ด๋ผ๊ณ ํ๋ค.
๊ฒฉ์ํ์ ๋ฒ์์ T์ ๋ฒ์๋ฅผ ๊ณ ๋ คํด๋ณด์์ ๋ ์์ ํ์์ผ๋ก ํด๋ ์ถฉ๋ถํ๋ค๋ ์ด์ผ๊ธฐ์๋ค.
// T๋งํผ ๋ฐ๋ณต
for (int t = 0; t < T; t++) {
// ๋ฏธ์ธ๋จผ์ง ํ์ฐ
board = spread();
// ๊ณต๊ธฐ์ฒญ์ ๊ธฐ ์๋
airCleaner();
}
ํ์ฅ๋ ๋ฏธ์ธ๋จผ์ง๋ฅผ ์ ์ฅํ ์๋ก์ด ์ด์ฐจ์ ๋ฐฐ์ด newBoard๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ ๋ฐํํ๋ค.
2์ฐจ์ ๋ฐฐ์ด์ ์์ ํ์์ผ๋ก ๋๋ฉด์ ๋ฏธ์ธ๋จผ์ง๋ฅผ ํ์ฅํด๋๊ฐ๋ ๋ก์ง์ด๋ค.
private static int[][] spread() {
int[][] newBoard = new int[R][C];
//๊ณต๊ธฐ์ฒญ์ ๊ธฐ ์์น ๋ณต์ฌ
newBoard[air.get(0)[0]][air.get(0)[1]] = -1;
newBoard[air.get(1)[0]][air.get(1)[1]] = -1;
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if (board[i][j] > 0) {
int spreadAmount = board[i][j] /5;
int cnt = 0;
//ํ์ฐ๋ ๋จผ์ง๋ฅผ newBoard์ ๋์
for (int k = 0; k < 4; k++) {
int nx = i + di[k];
int ny = j + dj[k];
if (nx >= 0 && nx < R && ny >= 0 && ny < C && board[nx][ny] != -1) {
newBoard[nx][ny] += spreadAmount;
cnt += 1;
}
}
//๋จ์ ๋ฏธ์ธ๋จผ์ง๋ฅผ newBoard์ ๋ํจ
newBoard[i][j] += board[i][j] - spreadAmount * cnt;
}
}
}
return newBoard;
}
์๋จ ๊ณต๊ธฐ์ฒญ์ ๊ธฐ๋ ๋ฐ์๊ณ๋ฐฉํฅ์ผ๋ก,
ํ๋จ ๊ณต๊ธฐ์ฒญ์ ๊ธฐ๋ ์๊ณ๋ฐฉํฅ์ผ๋ก ๋๊ธฐ ๋๋ฌธ์
๋ก์ง์ ๋ฐ๋ก๋ฐ๋ก ์ฒ๋ฆฌํ๋ค๋ณด๋ ์ฝ๋๊ฐ ๊ต์ฅํ ๊ธธ์ด์ก๋ค.
๋ก์ง์ ๊ฐ๋จํ๊ฒ for๋ฌธ์ผ๋ก ๋ฐฉํฅ์ ๋๋ฆฌ๋ฉด์ ๋ฏธ์ธ๋จผ์ง๋ฅผ ํ ์นธ ์ฉ ์ด๋์ํค๋ฉด ๋๋ค.
์ด๋, ์ฃผ์ํด์ผํ ๋ถ๋ถ์ ํ ์นธ ์ฉ ๋ฐ๋ฆฌ๋ค๋ณด๋ฉด ์ ์ผ ๋ ์นธ์ ๋ฏธ์ธ๋จผ์ง๊ฐ ๋ฎ์ด์์์ง๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ temp๋ก ์ ์ฅํ๊ณ , ๋ค์ ๋ฐฉํฅ ๋ ๋๊ฒจ์ฃผ์ด์ผ ํ๋ค.
private static void airCleaner() {
int x1 = air.get(0)[0]; // ์๋จ ๊ณต๊ธฐ์ฒญ์ ๊ธฐ ํ
int x2 = air.get(1)[0]; // ํ๋จ ๊ณต๊ธฐ์ฒญ์ ๊ธฐ ํ
// 1. ์๋จ ๊ณต๊ธฐ์ฒญ์ ๊ธฐ (๋ฐ์๊ณ ๋ฐฉํฅ: ์ฐ -> ์ -> ์ข -> ํ)
// 1-1. ์ค๋ฅธ์ชฝ ์ด๋ (x1 ํ)
// (x1, C-1) ๊ฐ์ ์ ์ฅ
int temp = board[x1][C - 1];
for (int j = C - 1; j > 1; j--) {
board[x1][j] = board[x1][j - 1];
}
// (x1, 1)์ ์ ํ๋ ๋ฐ๋์ด ๋ค์ด์ด. (x1, 0)์ -1๋ก ์ ์ง
board[x1][1] = 0;
// 1-2. ์์ชฝ ์ด๋ (C-1 ์ด)
// (0, C-1) ๊ฐ์ ์ ์ฅ
int temp2 = board[0][C - 1];
for (int i = 0; i < x1 - 1; i++) {
board[i][C - 1] = board[i + 1][C - 1];
}
// ์ด์ ๋จ๊ณ (x1, C-1) ๊ฐ์ด (x1-1, C-1)๋ก ์ด๋
board[x1 - 1][C - 1] = temp;
temp = temp2; // ๋ค์ ๋จ๊ณ์์ (0, C-1) ๊ฐ์ ์ฌ์ฉ
// 1-3. ์ผ์ชฝ ์ด๋ (0 ํ)
// (0, 0) ๊ฐ์ ์ ์ฅ (0, 0)์ -1์ด ์๋! (0, 0)์ด ๊ฒฝ๊ณ
temp2 = board[0][0];
for (int j = 0; j < C - 2; j++) { // j=0๋ถํฐ C-3๊น์ง (C-2์นธ ์ด๋)
board[0][j] = board[0][j + 1];
}
// ์ด์ ๋จ๊ณ (0, C-1) ๊ฐ์ด (0, C-2)๋ก ์ด๋
board[0][C - 2] = temp;
temp = temp2; // (0, 0) ๊ฐ์ ๋ค์ ๋จ๊ณ์์ ์ฌ์ฉ
// 1-4. ์๋์ชฝ ์ด๋ (0 ์ด)
// (x1-1, 0) ๊ฐ์ ์ ์ฅ (์ด๋์ ๋ ์ง์ )
temp2 = board[x1 - 1][0];
for (int i = x1 - 1; i > 1; i--) { // i=x1-1๋ถํฐ 2๊น์ง (x1-2์นธ ์ด๋)
board[i][0] = board[i - 1][0];
}
// ์ด์ ๋จ๊ณ (0, 0) ๊ฐ์ด (1, 0)์ผ๋ก ์ด๋
board[1][0] = temp;
// ๊ณต๊ธฐ์ฒญ์ ๊ธฐ (-1)๋ก ๋ฏธ์ธ๋จผ์ง๊ฐ ๋ค์ด๊ฐ ๊ฒ์ ์ ํ๋๋ฏ๋ก, (x1-1, 0)์ ์๋ ๊ฐ์ ์ฌ๋ผ์ง.
// 2. ํ๋จ ๊ณต๊ธฐ์ฒญ์ ๊ธฐ (์๊ณ ๋ฐฉํฅ: ์ฐ -> ํ -> ์ข -> ์)
// 2-1. ์ค๋ฅธ์ชฝ ์ด๋ (x2 ํ)
temp = board[x2][C - 1];
for (int j = C - 1; j > 1; j--) {
board[x2][j] = board[x2][j - 1];
}
board[x2][1] = 0;
// 2-2. ์๋์ชฝ ์ด๋ (C-1 ์ด)
temp2 = board[R - 1][C - 1];
for (int i = R - 1; i > x2 + 1; i--) {
board[i][C - 1] = board[i - 1][C - 1];
}
board[x2 + 1][C - 1] = temp;
temp = temp2;
// 2-3. ์ผ์ชฝ ์ด๋ (R-1 ํ)
temp2 = board[R - 1][0];
for (int j = 0; j < C - 2; j++) {
board[R - 1][j] = board[R - 1][j + 1];
}
board[R - 1][C - 2] = temp;
temp = temp2;
// 2-4. ์์ชฝ ์ด๋ (0 ์ด)
// (x2+1, 0) ๊ฐ์ ์ ์ฅ (์ด๋์ ๋ ์ง์ )
temp2 = board[x2 + 1][0];
for (int i = x2 + 1; i < R - 1; i++) {
board[i][0] = board[i + 1][0];
}
board[R - 2][0] = temp;
// ๊ณต๊ธฐ์ฒญ์ ๊ธฐ (-1)๋ก ๋ฏธ์ธ๋จผ์ง๊ฐ ๋ค์ด๊ฐ ๊ฒ์ ์ ํ๋๋ฏ๋ก, (x2+1, 0)์ ์๋ ๊ฐ์ ์ฌ๋ผ์ง.
}
์
๋ ฅ๊ฐ์ ๋ฒ์๋ฅผ ๊ณ ๋ คํ์ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ ํํ ๊ฒ.
bfs, dfs์๋ง ์ฌ๋ก์กํ์ง ๋ง๊ณ ์์ ํ์์ผ๋ก๋ ๊ฐ๋ฅํ์ง๋ฅผ ๊ณ ๋ คํด๋ณผ ๊ฒ
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;
//์ฒ์์๋ bfs๋ก ์ ๊ทผ -> ใดใด ๋ฐ๋ณต๋ฌธ์ผ๋ก ํ์
//๊ณต๊ธฐ์ฒญ์ ๊ธฐ ํผ ๊ฑฐ dfs๋ก ์ ๊ทผ -> ใดใด ๋ฐ๋ณต๋ฌธ์ผ๋ก ํ์
public class backjoon_17144_๋ฏธ์ธ๋จผ์ง {
static int R, C, T;
static int[][] board;
static int[] di = { -1, 1, 0, 0 };
static int[] dj = { 0, 0, -1, 1 };
static List<int[]> air;
// ์ฒซ๋ฒ์งธ ๊ณต์ฒญ ๋ฐฉํฅ ์ฐ, ์, ์ข, ํ
static int[] airDi_1 = { 0, -1, 0, 1 };
static int[] airDj_1 = { 1, 0, -1, 0 };
// ๋๋ฒ์งธ ๊ณต์ฒญ ๋ฐฉํฅ ์ฐ, ํ, ์ข, ์
static int[] airDi_2 = { 0, 1, 0, -1 };
static int[] airDj_2 = { 1, 0, -1, 0 };
public static void main(String[] args) throws IOException {
// R,C,T์ ๋ฒ์๋ฅผ ๊ณ ๋ คํด๋ณด์์ ๋ ์์ ํ์์ผ๋ก ํ๋ ๊ฒ ๋์
System.setIn(new FileInputStream("src/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
T = Integer.parseInt(st.nextToken());
board = new int[R][C];
air = new ArrayList<>();
for (int i = 0; i < R; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < C; j++) {
board[i][j] = Integer.parseInt(st.nextToken());
if (board[i][j] == -1) {
air.add(new int[] { i, j });
}
}
}
// T๋งํผ ๋ฐ๋ณต
for (int t = 0; t < T; t++) {
// ๋ฏธ์ธ๋จผ์ง ํ์ฐ
board = spread();
// ๊ณต๊ธฐ์ฒญ์ ๊ธฐ ์๋
airCleaner();
}
// ๋จ์์๋ ๋ฏธ์ธ๋จผ์ง์ ์์ ๊ตฌํ๊ธฐ
int rest = 0;
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if (board[i][j] > 0) {
rest += board[i][j];
}
}
}
System.out.println(rest);
}
private static void airCleaner() {
int x1 = air.get(0)[0]; // ์๋จ ๊ณต๊ธฐ์ฒญ์ ๊ธฐ ํ
int x2 = air.get(1)[0]; // ํ๋จ ๊ณต๊ธฐ์ฒญ์ ๊ธฐ ํ
// 1. ์๋จ ๊ณต๊ธฐ์ฒญ์ ๊ธฐ (๋ฐ์๊ณ ๋ฐฉํฅ: ์ฐ -> ์ -> ์ข -> ํ)
// 1-1. ์ค๋ฅธ์ชฝ ์ด๋ (x1 ํ)
// (x1, C-1) ๊ฐ์ ์ ์ฅ
int temp = board[x1][C - 1];
for (int j = C - 1; j > 1; j--) {
board[x1][j] = board[x1][j - 1];
}
// (x1, 1)์ ์ ํ๋ ๋ฐ๋์ด ๋ค์ด์ด. (x1, 0)์ -1๋ก ์ ์ง
board[x1][1] = 0;
// 1-2. ์์ชฝ ์ด๋ (C-1 ์ด)
// (0, C-1) ๊ฐ์ ์ ์ฅ
int temp2 = board[0][C - 1];
for (int i = 0; i < x1 - 1; i++) {
board[i][C - 1] = board[i + 1][C - 1];
}
// ์ด์ ๋จ๊ณ (x1, C-1) ๊ฐ์ด (x1-1, C-1)๋ก ์ด๋
board[x1 - 1][C - 1] = temp;
temp = temp2; // ๋ค์ ๋จ๊ณ์์ (0, C-1) ๊ฐ์ ์ฌ์ฉ
// 1-3. ์ผ์ชฝ ์ด๋ (0 ํ)
// (0, 0) ๊ฐ์ ์ ์ฅ (0, 0)์ -1์ด ์๋! (0, 0)์ด ๊ฒฝ๊ณ
temp2 = board[0][0];
for (int j = 0; j < C - 2; j++) { // j=0๋ถํฐ C-3๊น์ง (C-2์นธ ์ด๋)
board[0][j] = board[0][j + 1];
}
// ์ด์ ๋จ๊ณ (0, C-1) ๊ฐ์ด (0, C-2)๋ก ์ด๋
board[0][C - 2] = temp;
temp = temp2; // (0, 0) ๊ฐ์ ๋ค์ ๋จ๊ณ์์ ์ฌ์ฉ
// 1-4. ์๋์ชฝ ์ด๋ (0 ์ด)
// (x1-1, 0) ๊ฐ์ ์ ์ฅ (์ด๋์ ๋ ์ง์ )
temp2 = board[x1 - 1][0];
for (int i = x1 - 1; i > 1; i--) { // i=x1-1๋ถํฐ 2๊น์ง (x1-2์นธ ์ด๋)
board[i][0] = board[i - 1][0];
}
// ์ด์ ๋จ๊ณ (0, 0) ๊ฐ์ด (1, 0)์ผ๋ก ์ด๋
board[1][0] = temp;
// ๊ณต๊ธฐ์ฒญ์ ๊ธฐ (-1)๋ก ๋ฏธ์ธ๋จผ์ง๊ฐ ๋ค์ด๊ฐ ๊ฒ์ ์ ํ๋๋ฏ๋ก, (x1-1, 0)์ ์๋ ๊ฐ์ ์ฌ๋ผ์ง.
// 2. ํ๋จ ๊ณต๊ธฐ์ฒญ์ ๊ธฐ (์๊ณ ๋ฐฉํฅ: ์ฐ -> ํ -> ์ข -> ์)
// 2-1. ์ค๋ฅธ์ชฝ ์ด๋ (x2 ํ)
temp = board[x2][C - 1];
for (int j = C - 1; j > 1; j--) {
board[x2][j] = board[x2][j - 1];
}
board[x2][1] = 0;
// 2-2. ์๋์ชฝ ์ด๋ (C-1 ์ด)
temp2 = board[R - 1][C - 1];
for (int i = R - 1; i > x2 + 1; i--) {
board[i][C - 1] = board[i - 1][C - 1];
}
board[x2 + 1][C - 1] = temp;
temp = temp2;
// 2-3. ์ผ์ชฝ ์ด๋ (R-1 ํ)
temp2 = board[R - 1][0];
for (int j = 0; j < C - 2; j++) {
board[R - 1][j] = board[R - 1][j + 1];
}
board[R - 1][C - 2] = temp;
temp = temp2;
// 2-4. ์์ชฝ ์ด๋ (0 ์ด)
// (x2+1, 0) ๊ฐ์ ์ ์ฅ (์ด๋์ ๋ ์ง์ )
temp2 = board[x2 + 1][0];
for (int i = x2 + 1; i < R - 1; i++) {
board[i][0] = board[i + 1][0];
}
board[R - 2][0] = temp;
// ๊ณต๊ธฐ์ฒญ์ ๊ธฐ (-1)๋ก ๋ฏธ์ธ๋จผ์ง๊ฐ ๋ค์ด๊ฐ ๊ฒ์ ์ ํ๋๋ฏ๋ก, (x2+1, 0)์ ์๋ ๊ฐ์ ์ฌ๋ผ์ง.
}
private static int[][] spread() {
int[][] newBoard = new int[R][C];
//๊ณต๊ธฐ์ฒญ์ ๊ธฐ ์์น ๋ณต์ฌ
newBoard[air.get(0)[0]][air.get(0)[1]] = -1;
newBoard[air.get(1)[0]][air.get(1)[1]] = -1;
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if (board[i][j] > 0) {
int spreadAmount = board[i][j] /5;
int cnt = 0;
//ํ์ฐ๋ ๋จผ์ง๋ฅผ newBoard์ ๋์
for (int k = 0; k < 4; k++) {
int nx = i + di[k];
int ny = j + dj[k];
if (nx >= 0 && nx < R && ny >= 0 && ny < C && board[nx][ny] != -1) {
newBoard[nx][ny] += spreadAmount;
cnt += 1;
}
}
//๋จ์ ๋ฏธ์ธ๋จผ์ง๋ฅผ newBoard์ ๋ํจ
newBoard[i][j] += board[i][j] - spreadAmount * cnt;
}
}
}
return newBoard;
}
}