본문 바로가기

Algorithm/Baekjoon Online Judge

[Java] BOJ16918_봄버맨

www.acmicpc.net/problem/16918

 

16918번: 봄버맨

첫째 줄에 R, C, N (1 ≤ R, C, N ≤ 200)이 주어진다. 둘째 줄부터 R개의 줄에 격자판의 초기 상태가 주어진다. 빈 칸은 '.'로, 폭탄은 'O'로 주어진다.

www.acmicpc.net


"다음 1초 동안 봄버맨은 아무것도 하지 않는다." 이 규칙을 통해 N == 1일 때는 처음과 상태가 같다는 것을 알 수 있다.

 

"다음 1초 동안 폭탄이 설치되어 있지 않은 모든 칸에 폭탄을 설치한다. 즉, 모든 칸은 폭탄을 가지고 있게 된다. 폭탄은 모두 동시에 설치했다고 가정한다."  이 규칙에서 2초에 모든 칸에 폭탄이 설치되는 것을 알 수 있고, 이것이 2초마다 반복 되는 것을 알 수 있다. 따라서 N이 짝수일 때는 모든 칸에 폭탄이 설치되어있다.

 

N이 3이상일 때는 폭탄의 위치를 List에 담아두고 모든 칸을 폭탄으로 채운 뒤 이전에 저장해둔 폭탄의 위치에서 4방향을 빈 공간으로 만들어주었다. 이 작업은 총 2초에 걸쳐 진행되기 때문에 N을 2씩 감소시키며 반복했다.

 

폭탄이 설치되는 패턴, 규칙을 찾아내는 것이 관건이 문제이다.

 

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

public class Main {

	static int[] dx = {-1,0,1,0};
	static int[] dy = {0,-1,0,1};
	
	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());
		List<Point> list = new ArrayList<Point>();
		char[][] arr = new char[R][C];
		for (int i = 0; i < R; i++) {
			String temp = br.readLine();
			for (int j = 0; j < C; j++) {
				if(temp.charAt(j) == 'O') list.add(new Point(i,j));
				arr[i][j] = temp.charAt(j);
			}
		}
		if(N==1) {
			for (int i = 0; i < R; i++) {
				for (int j = 0; j < C; j++) {
					System.out.print(arr[i][j]);
				}
				System.out.println();
			}
			return;
		}
		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();
			}
			return;
		}
		while(N>=3) {
			list.clear();
			for (int i = 0; i < R; i++) {
				for (int j = 0; j < C; j++) {
					if(arr[i][j]=='O') list.add(new Point(i,j));
				}
			}
			for (int i = 0; i < R; i++) {
				for (int j = 0; j < C; j++) {
					arr[i][j] = 'O';
				}
			}
			for (int i = 0; i < list.size(); i++) {
				arr[list.get(i).x][list.get(i).y] = '.';
				for(int j=0; j<4; j++) {
					int nx = list.get(i).x + dx[j];
					int ny = list.get(i).y + dy[j];
					if(nx >= 0 && ny >= 0 && nx < R && ny < C) arr[nx][ny] = '.';
				}
			}
			
			N = N-2;
		}
		for (int i = 0; i < R; i++) {
			for (int j = 0; j < C; j++) {
				System.out.print(arr[i][j]);
			}
			System.out.println();
		}
	}
	static class Point {
		int x,y;

		protected Point(int x, int y) {
			this.x = x;
			this.y = y;
		}
		
	}
}