๋ฐ์ํ
๋ฌธ์ (GOLD 2)
https://www.acmicpc.net/problem/18500
ํ์ด
์๋ฎฌ๋ ์ด์ ์ ๋ฌธ์ ๋ฅผ ์ฒ์ฒํ ๋ณด๋ฉด์ ํ๋ํ๋ ๊ตฌํํ๋๊ฒ ๊ฐ์ฅ ์ค์ํ ๊ฒ ๊ฐ๋ค.
Logic
- ๋์ด ์ ๋ ฅ ๋ฐ๊ธฐ
- ๋์ง๋ ์์น์ ๋ฐ๋ผ ๋ถ๊ธฐ
- ์์ด์ง ๋ฏธ๋ค๋ ์์น ์ฐพ๊ธฐ
- ์์ด์ง ๋ฏธ๋ค๋์ ์ค์ฌ์ผ๋ก
์ค๋ฅธ์ชฝ ๊ณต๊ฒฉ์ด๋ฉด ์, ํ, ์ข
์ผ์ชฝ ๊ณต๊ฒฉ์ด๋ฉด ์, ํ, ์ฐ
ํ์ํ๋ฉฐ, ๋จ์ด์ง ํด๋ฌ์คํฐ๊ฐ ์๋์ง ํ์ธ ( breakMineral() )
- BFS ๋๋ฉฐ, ๋ฐ๋ฅ๊ณผ ๋ง๋ฟ์ ์๋ ๊ณณ์ด ์๋์ง ํ์ธ
- ์์ผ๋ฉด false ๋ฆฌํด, ์์ผ๋ฉด true ๋ฆฌํด
- ํ์ ์, broken ๋ฆฌ์คํธ์ ํด๋ฌ์คํฐ๋ค์ ์์น ์ ์ฅ
- ํด๋ฌ์คํฐ ๋จ์ด๋จ๋ฆฌ๊ธฐ ( fallMineral() )
- ๋จ์ด์ง ๋ฏธ๋ค๋์ ์๋ฆฌ๋ฅผ ์ฒดํฌํ์ง ์๋๋ก ์์ ๋ฐฐ์ด์ ๋ง๋ค์ด ๋จ์ด์ง ๋ฏธ๋ค๋ ์๋ฆฌ๋ฅผ false ์ฒ๋ฆฌ
- ๋ชจ๋ ์์๊ฐ ์๋๋ก ํ์นธ ์ฉ ๋จ์ด์ง ์ ์๋์ง ํ๋ณ
- ๋จ์ด์ง ์ ์๋ค๋ฉด, ๊ธฐ์กด์ ๋ฏธ๋ค๋ ์๋ฆฌ๋ฅผ ๋จผ์ false๋ก ๋ชจ๋ ๋ฐ๊ฟ์ค
-> ๋์ค์ ๊ฒน์น ์ํ ์์ ใ ใ - ์๋ก์ด ๋ฏธ๋ค๋ ์๋ฆฌ๋ฅผ true ์ฒ๋ฆฌ
- ํ์นธ ์๋๋ก ๋ด๋ ค๊ฐ ์ธ๋ฑ์ค๋ก ๋ค์ ์ ์ฅ
- ๋จ์ด์ง ์ ์์ ๋๊น์ง ๋ฐ๋ณต
๋์ณค๋ ๋ถ๋ถ
- ์๋๋ถ๋ถ ์ฒดํฌ!
=> ์๋๋ ๋น์ฐํ ๋ฟ์์๋ค๊ณ ์๊ฐํด์ ์ฒดํฌ๋ฅผ ์ํ์์ ใ ใ - ๋จ์ด๋จ๋ฆฌ๊ธฐ ์ , ๋ฏธ๋ค๋ ์๋ฆฌ ๋จผ์ ๋ชจ๋ false์ฒ๋ฆฌ
=> ํ๋์ฉ ๋๋ฉฐ false ๋ฐ๊พธ๊ณ true๋ก ๋ฐ๋ก ๋ฐ๊พธ๋ ๋ก์ง์ ํ์์ง๋ง, ์๋ฆฌ๊ฐ ๊ฒน์น ๊ฒฝ์ฐ์ ๋จ์ด์ง ๋ฏธ๋ค๋ ์๋ฆฌ๋ false์ฒ๋ฆฌ ๋จ
์ฝ๋
๋๋ณด๊ธฐ
package simulation;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main_2933_๋ฏธ๋ค๋ {
static int[] di = {-1, 0, 1, 0};
static int[] dj = {0, 1, 0, -1};
static int R, C;
static boolean[][] mineral;
static int N;
static List<int[]> broken;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
mineral = new boolean[R][C];
for (int i = 0; i < R; i++) {
String str = br.readLine();
for (int j = 0; j < C; j++) {
mineral[i][j] = (str.charAt(j) == '.') ? false : true;
}
}
N = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
int height = R-Integer.parseInt(st.nextToken());
broken = new ArrayList<>();
if(i%2==0){ // ์ผ์ชฝ์์ ๊ณต๊ฒฉ
int pos = 0;
while(pos<C && !mineral[height][pos++]); // ๋ถ์ค ๋ฏธ๋ค๋์ j๊ฐ ์ฐพ๊ธฐ
if(pos >= C && !mineral[height][pos-1]) continue;
mineral[height][--pos] = false; // ๋ถ์ค ๋ฏธ๋ค๋ false ์ฒ๋ฆฌ
if(pos < C-1 && height < R-1 && mineral[height][pos+1] && breakMineral(height, pos+1, height+1)) fallMineral(); // ์ค๋ฅธ์ชฝ ํ์
else if(pos < C && height > 0 && mineral[height-1][pos] &&breakMineral(height-1, pos, height)) fallMineral(); // ์์ชฝ ํ์
else if(pos < C && height < R-1 && mineral[height+1][pos] &&breakMineral(height+1, pos, height)) fallMineral(); // ์๋์ชฝ ํ์
}
else if(i%2 == 1){ // ์ค๋ฅธ์ชฝ์์ ๊ณต๊ฒฉ
int pos = C-1;
while(pos>=0 && !mineral[height][pos--]); // ๋ถ์ค ๋ฏธ๋ค๋ j๊ฐ ์ฐพ๊ธฐ
if(pos < 0 && !mineral[height][pos+1]) continue;
mineral[height][++pos] = false;
if(pos > 0 && height < R-1 && mineral[height][pos-1] && breakMineral(height, pos-1, height+1)) fallMineral(); // ์ผ์ชฝ ํ์
else if(pos >= 0 && height > 0 && mineral[height-1][pos] && breakMineral(height-1, pos, height)) fallMineral(); // ์์ชฝ ํ์
else if(pos >= 0 && height < R-1 && mineral[height+1][pos] && breakMineral(height+1, pos, height)) fallMineral(); // ์๋์ชฝ ํ์
}
}
for(int i =0 ; i < R ; i++){
for(int j = 0 ; j < C ; j++){
System.out.print((mineral[i][j])?'x':'.');
}
System.out.println();
}
}
private static void fallMineral() {
out:while(true) {
boolean[][] tmpMin = new boolean[R][C];
for(int i =0 ; i < R ; i++) tmpMin[i] = Arrays.copyOf(mineral[i], C); // ๋จ์ด์ง ๋ฏธ๋ค๋์ ์ฒดํฌํ์ง ์๋๋ก ์์ ๋ฐฐ์ด ๋ง๋ค์ด ์ค
for(int[] c : broken) tmpMin[c[0]][c[1]] = false; // ๋จ์ด์ง ๋ฏธ๋ค๋ ์๋ฆฌ๋ฅผ false
for(int[] c : broken) {
if (c[0]+1 >= R || tmpMin[c[0]+1][c[1]]) { // ๋ชจ๋ ์์๊ฐ ์๋๋ก ํ์นธ์ฉ ๋จ์ด์ง ์ ์๋์ง ํ๋ณ
break out;
}
}
// ํ์นธ์ฉ ๋จ์ด์ง ์ ์๋ค!
for(int[] c : broken) mineral[c[0]][c[1]] = false; // ๊ธฐ์กด์ ๋ฏธ๋ค๋ ์๋ฆฌ๋ฅผ ๋จผ์ false ์ฒ๋ฆฌ -> ๋์ค์ ๊ฒน์น ์ํ ์์
for(int i =0 ; i < broken.size() ; i++){
int[] tmp = broken.get(i);
mineral[tmp[0]+1][tmp[1]] = true; // ์๋ก์ด ์๋ฆฌ true
broken.set(i, new int[]{tmp[0]+1, tmp[1]}); // ํ์นธ ์๋๋ก ๋ด๋ ค๊ฐ ์ธ๋ฑ์ค๋ก ๋ค์ ์ ์ฅ
}
}
}
private static boolean breakMineral(int i, int j, int height) {
boolean[][] visited = new boolean[R][C];
Queue<int[]> q = new ArrayDeque<>();
q.offer(new int[]{i, j});
broken.add(new int[]{i, j});
visited[i][j] = true;
while(!q.isEmpty()){
int[] cur = q.poll();
for(int d= 0 ; d < 4 ; d++){
int ni = cur[0]+di[d];
int nj = cur[1]+dj[d];
if(0<=ni&&ni<R && 0<=nj&&nj<C && mineral[ni][nj] && !visited[ni][nj]){
if(ni == R-1){ // ๋ฐ๋ฅ๊ณผ ๋ง๋ฟ์ ์๋ ๊ณณ์ด ์์ผ๋ฉด ์ ๋จ์ด์ง๋ ๊ฑฐ์
broken.clear();
return false;
}
q.offer(new int[]{ni, nj});
visited[ni][nj] = true;
broken.add(new int[]{ni, nj});
}
}
}
return true;
}
}
๋ฐ์ํ
'๐ ์๊ณ ๋ฆฌ์ฆ > Simulation' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 20055๋ฒ: ์ปจ๋ฒ ์ด์ด ๋ฒจํธ ์์ ๋ก๋ด( Java ) (0) | 2022.04.14 |
---|---|
[๋ฐฑ์ค] 2174๋ฒ: ๋ก๋ด ์๋ฎฌ๋ ์ด์ (JAVA) (0) | 2022.03.31 |
[๋ฐฑ์ค] 16918๋ฒ: ๋ด๋ฒ๋งจ (JAVA) (0) | 2022.03.29 |