알고리즘/백준

16918_봄버맨

베리영young 2025. 6. 14. 21:32

사용 알고리즘: 구현, 시뮬레이션

사용 언어: java

 

package ssafyRoom2_Monthly_Silver_Random_Defense;

import java.io.*;
import java.util.*;


public class Main {
	static List<int[]> bombs = new ArrayList<>();

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int R = Integer.parseInt(st.nextToken());
		int C = Integer.parseInt(st.nextToken());
		int N = Integer.parseInt(st.nextToken());
		
		char[][][] maps = new char[3][R][C]; // 짝수일 땐 O으로만 채우니까 제외
		
		for (int i = 0; i < R; i++) {
			String s = br.readLine();
			for (int j = 0; j < C; j++) {
				maps[0][i][j] = s.charAt(j);
				if(maps[0][i][j] == 'O') {
					bombs.add(new int[] {i, j});
				}
			}
		}
		
		bomb(maps, R, C);
		
		if(N <= 1) {
			for (int i = 0; i < R; i++) {
				for (int j = 0; j < C; j++) {
					System.out.print(maps[0][i][j]);
				}
				System.out.println();
			}
		} else if(N % 2 == 0) {
			for (int i = 0; i < R; i++) {
				for (int j = 0; j < C; j++) {
					System.out.print('O');
				}
				System.out.println();
			}
		} else if(N % 4 == 3) { //3 7 11 ...
			for (int i = 0; i < R; i++) {
				for (int j = 0; j < C; j++) {
					System.out.print(maps[1][i][j]);
				}
				System.out.println();
			}
		} else {
			for (int i = 0; i < R; i++) {
				for (int j = 0; j < C; j++) {
					System.out.print(maps[2][i][j]);
				}
				System.out.println();
			}
		}
	}

	private static void bomb(char[][][] maps, int R, int C) {
		char[][] tmap = new char[R][C];
		for (int i = 0; i < R; i++) {
			Arrays.fill(tmap[i], 'O');
		}
		
		int[] dx = {-1,1,0,0};
		int[] dy = {0,0,-1,1};
		
		for(int[] b : bombs) {
			tmap[b[0]][b[1]] = '.';
			for (int d = 0; d < 4; d++) {
				int nx = b[0] + dx[d];
				int ny = b[1] + dy[d];
				
				if(nx>=0&&nx<R && ny>=0&&ny<C) {
					tmap[nx][ny] = '.';
				}
			}
		}
		
		bombs.clear();
		
		for (int i = 0; i < R; i++) {
			for (int j = 0; j < C; j++) {
				maps[1][i][j] = tmap[i][j];
				if(tmap[i][j] == 'O') {
					bombs.add(new int[] {i, j});
				}
			}
		}
		
		for (int i = 0; i < R; i++) {
			Arrays.fill(tmap[i], 'O');
		}
		
		for(int[] b : bombs) {
			tmap[b[0]][b[1]] = '.';
			for (int d = 0; d < 4; d++) {
				int nx = b[0] + dx[d];
				int ny = b[1] + dy[d];
				
				if(nx>=0&&nx<R && ny>=0&&ny<C) {
					tmap[nx][ny] = '.';
				}
			}
		}
		
		for (int i = 0; i < R; i++) {
			for (int j = 0; j < C; j++) {
				maps[2][i][j] = tmap[i][j];
				if(tmap[i][j] == 'O') {
					bombs.add(new int[] {i, j});
				}
			}
		}
	}

}

 

나올 수 있는 맵의 모양은 반복된다.

그러므로 나올 수 있는 네 가지 경우의 수를 미리 구해놓고

N번째에 어떤 패턴의 맵이 나올지 출력해야 한다.

 

만약 빡구현을 한다면 시간 초과가 난다.......

 

나올 수 있는 네 가지 수

1. 초기에 입력 받은 맵(N=0이거나 1일 때)

2. 맵 전체가 'O'으로 채워진 맵(N이 2이상 짝수일 때)

3. N=3일 때 맵(N이 2이상이고 N%4가 3일 때)

4. N==5일 때 맵(나머지 경우)

'알고리즘 > 백준' 카테고리의 다른 글

6236_용돈 관리  (1) 2025.06.15
1946_신입 사원  (0) 2025.06.15
1417_국회의원 선거  (1) 2025.06.09
2458_키 순서  (1) 2025.05.06
1812_사탕  (1) 2025.05.05