Algorithm/백준

[백준] 16928 봄버맨

SSONGMI 2021. 6. 16. 20:38
반응형

문제 출처: https://www.acmicpc.net/problem/16918

 

16918번: 봄버맨

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

www.acmicpc.net

 

1. 입력

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

 

2. 출력

: 총 R개의 줄에 N초가 지난 후의 격자판 상태를 출력한다.

 

3. 풀이

: 다음 차례에 터질 폭탄은 X로 터지지 않을 폭탄은 O로 하여 구분해준다.

: 시간을 1초씩 세면서 우선 폭탄이 있는 자리는 X로 바꾸고, 폭탄이 없는 자리는 폭탄을 놓아야 하기 때문에 O로 바꿔준다.

: 그 다음 1초에서는 X로 된 자리들이 사방으로 폭발해야 하기 때문에 폭발하고 나서 .으로 바꿔준다.

: 마지막에 답을 출력할 때는 X였던 자리들 또한 O로 바꿔 폭탄임을 알려준다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static StringBuilder sb = new StringBuilder();
	static StringTokenizer st;
	static int R, C, N;
	static char[][] map;
	static int[] dr = { -1, 1, 0, 0 };
	static int[] dc = { 0, 0, -1, 1 };

	public static void main(String[] args) throws Exception {
		st = new StringTokenizer(br.readLine());
		R = Integer.parseInt(st.nextToken());
		C = Integer.parseInt(st.nextToken());
		N = Integer.parseInt(st.nextToken());

		map = new char[R][C];
		for (int i = 0; i < R; i++) {
			String tmp = br.readLine();
			for (int j = 0; j < C; j++) {
				map[i][j] = tmp.charAt(j);
			}
		}

		for (int t = 1; t < N; t++) {
			for (int i = 0; i < R; i++) {
				for (int j = 0; j < C; j++) {
					if (map[i][j] == 'O') {
						map[i][j] = 'X';
					} else if (map[i][j] == '.') {
						map[i][j] = 'O';
					}
				}
			}

			t++;
			if (t >= N) {
				break;
			}
			for (int i = 0; i < R; i++) {
				for (int j = 0; j < C; j++) {
					if (map[i][j] == 'X') {
						map[i][j] = '.';
						change(i, j);
					}
				}
			}
		}
		for (int i = 0; i < R; i++) {
			for (int j = 0; j < C; j++) {
				if (map[i][j] == 'X')
					map[i][j] = 'O';
				sb.append(map[i][j]);
			}
			sb.append("\n");
		}
		System.out.println(sb);

	}

	private static void change(int r, int c) {
		for (int i = 0; i < 4; i++) {
			int nr = r + dr[i];
			int nc = c + dc[i];
			if (nr < 0 || nr >= R || nc < 0 || nc >= C || map[nr][nc] == 'X')
				continue;
			map[nr][nc] = '.';
		}
	}

}
반응형