• Baekjoon 16918 봄버맨 JAVA

    2022. 6. 22.

    by. 순일

     

    16918번: 봄버맨

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

    www.acmicpc.net

    문제

    봄버맨은 크기가 R×C인 직사각형 격자판 위에서 살고 있다. 격자의 각 칸은 비어있거나 폭탄이 들어있다.

    폭탄이 있는 칸은 3초가 지난 후에 폭발하고, 폭탄이 폭발한 이후에는 폭탄이 있던 칸이 파괴되어 빈칸이 되며, 인접한 네 칸도 함께 파괴된다. 즉, 폭탄이 있던 칸이 (i, j)인 경우에 (i+1, j), (i-1, j), (i, j+1), (i, j-1)도 함께 파괴된다. 만약, 폭탄이 폭발했을 때, 인접한 칸에 폭탄이 있는 경우에는 인접한 폭탄은 폭발 없이 파괴된다. 따라서, 연쇄 반응은 없다.

    봄버맨은 폭탄에 면역력을 가지고 있어서, 격자판의 모든 칸을 자유롭게 이동할 수 있다. 봄버맨은 다음과 같이 행동한다.

    • 가장 처음에 봄버맨은 일부 칸에 폭탄을 설치해 놓는다. 모든 폭탄이 설치된 시간은 같다.
    • 다음 1초 동안 봄버맨은 아무것도 하지 않는다.
    • 다음 1초 동안 폭탄이 설치되어 있지 않은 모든 칸에 폭탄을 설치한다. 즉, 모든 칸은 폭탄을 가지고 있게 된다. 폭탄은 모두 동시에 설치했다고 가정한다.
    • 1초가 지난 후에 3초 전에 설치된 폭탄이 모두 폭발한다.
    • 3과 4를 반복한다.

    폭탄을 설치해놓은 초기 상태가 주어졌을 때, N초가 흐른 후의 격자판 상태를 구하려고 한다.

    예를 들어, 초기 상태가 아래와 같은 경우를 보자.

    ...
    .O.
    ...

    1초가 지난 후에는 아무 일도 벌어지지 않기 때문에, 위와 같다고 볼 수 있다. 1초가 더 흐른 후에 격자판의 상태는 아래와 같아진다.

    OOO
    OOO
    OOO

    1초가 지난 후엔 가운데에 있는 폭탄이 폭발해 가운데 칸과 인접한 네 칸이 빈칸이 된다.

    O.O
    ...
    O.O

     

    조건

    [입력]

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

     

    [출력]

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

     

    풀이

    해당 문제는 주어진 조건을 수행하고 몇 초 뒤 map의 결과를 출력하는 문제다.

    시키는 대로 구현하면 쉽게 해결 가능한 문제다.

    로직은 아래와 같은 방식으로 구현하였다.

    1. 입력 처리를 한다.

    2. 시간만큼 반복문을 돌리는데 이때 시간 -1 만큼만 돈다. (조건에서 한번 1초 동안 아무 동작도 하지 않기 때문)

        2-1 현재 해야 하는 동작을 체크한다.

            2-1-1. 폭탄을 설치한다. (기존에 폭탄 좌표는 큐에 담고 새로운 폭탄은 배열에 추가해준다.)

            2-1-2. 폭탄을 터트린다. (큐에 담긴 좌표를 기준으로 자기 자신 포함 4방 탐색하여 배열에 폭탄을 제거한다.)

    3. 출력한다.

     

    코드
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.StringTokenizer;
    
    public class Main {
    
    	static int R, C, N, dy[] = {-1,1,0,0}, dx[]= {0,0,-1,1};
    	static char[][] map;
    	static Queue<Node> q = new LinkedList<>();
    	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());
    		N = Integer.parseInt(st.nextToken());
    		map = new char[R][C];	
    		for (int i = 0; i < R; i++) {
    			map[i] = br.readLine().toCharArray();
    		}
    		boolean check = true; //시간마다 하는 동작이다르니 체크
    		while(N-->1) {
    			if(check) { // 여기서 꽉 채우기 + 큐에담기
    				insert();
    			}else { // 여기선 큐에 담긴거 터트리기
    				bomb();
    			}
    			check = !check;
    		}
    		print();
    	}
    	private static void print() { // 출력
    		for (int i = 0; i < R; i++) {
    			for (int j = 0; j < C; j++) {
    				System.out.print(map[i][j]+"");
    			}
    			System.out.println();
    		}
    	}
    	private static void bomb() { // 폭탄 폭발
    		while(!q.isEmpty()) {
    			Node n = q.poll();
    			map[n.y][n.x] = '.';
    			for (int i = 0; i < 4; i++) {
    				int ny = n.y + dy[i];
    				int nx = n.x + dx[i];
    				if(ny < 0 || nx < 0 || ny >= R || nx >= C || map[ny][nx] == '.')
    					continue;
    				map[ny][nx] = '.';
    			}
    		}
    	}
    	
    	private static void insert() { // 폭탄 추가 설치 및 기존 폭탄 담기
    		for (int i = 0; i < R; i++) {
    			for (int j = 0; j < C; j++) {
    				if(map[i][j] == 'O')
    					q.add(new Node(i,j));
    				else
    					map[i][j] = 'O';
    			}
    		}
    	}
    	static class Node{
    		int y, x;
    		Node(int y, int x){
    			this.y = y;
    			this.x = x;
    		}
    	}
    }

     

     

    GitHub - JUNGSOONIL/Algorithm-JAVA: 알고리즘 문제 해결 자바 소스 코드

    알고리즘 문제 해결 자바 소스 코드. Contribute to JUNGSOONIL/Algorithm-JAVA development by creating an account on GitHub.

    github.com

     

    728x90

    댓글