https://www.acmicpc.net/problem/16918

 

16918번: 봄버맨

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

www.acmicpc.net

 

 

문제풀이

BFS 문제입니다.

문제를 구현하는데 있어서 제가 헷갈렸었던 점은,

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

이 조건들이었습니다.

 

여기서 

0초 일떄 : 아무일이 일어나지 않는다. (기본 초기값만 세팅)

1초 일떄 : 아무일도 일어나지 않는다.

2초 일때 : 먼저, 이전에 설치된 폭탄들의 위치를 Queue에 넣습니다. 그 이후에 폭탄이 설치되어있지 않은 모든 칸에 폭탄을 설치합니다.

3초 일떄 : 0초의 초기값들을 가지고서 (2초)일떄 Queue에 넣었던 값들을 BFS를 통해 폭발시킵니다.

4초 일때 : 먼저, 이전에 설치된 폭탄들의 위치를 Queue에 넣습니다. 그 이후에 폭탄이 설치되어있지 않은 모든 칸에 폭탄을 설치합니다.

5초 일떄 : 4초의 초기값들을 가지고서 (4초)일떄 Queue에 넣었던 값들을 BFS를 통해 폭발시킵니다.

...

...

..

 

 

여기서 보면 문제의 5번 조건에

3과 4를 반복한다고 나와있습니다.

해당 조건을 완벽히 이해하지 못하고서 진행하여 

time = 0, time = 1초 일때부터 작업을 시작하여 시간이 소요되었습니다.

 

5번 조건을 잘 이해하지 못하고 진행하여

처음에 time = 0 초, 즉 0초부터 N초까지 작업을 진행했기에 0초, 1초 일떄의 조건을 수행하면서 오답이 나왔었습니다.

즉, 2초부터 작업이 시작되어야합니다.

 

또, 문제에서 시간이 짝수(time%2==0)라면, 이전 폭탄의 위치를 먼저 Queue에 저장하고, 전체 배열을 'O'로 초기화시키는것.

홀수(time%2==1)일때는 이전에 저장된 Queue의 폭탄값들을 모두 BFS로 터뜨린다는 점이 헷갈렸었습니다.

 

 

 

문제코드

import java.util.*;

public class Main {
	
	public static int R, C, N;
	public static char[][] map;
	public static int time=0;
	public static Queue<Node> q = new LinkedList<>();
    public static void main(String[] args) {
    	Scanner sc = new Scanner(System.in);
    	R = sc.nextInt();
    	C = sc.nextInt();
    	N = sc.nextInt();
    	map = new char[R][C];
    	
    	//초기값 입력받음.
    	for(int i=0;i<R;i++) {
    		String str = sc.next();
    		for(int j=0;j<C;j++) {
    			map[i][j] = str.charAt(j);
    		}
    	}
    	
    	//0초 : 봄버맨 초기값.
    	//1초 : 1초동안 아무것도 안하므로 time = 2초부터 시작해야한다.
    	
    	//2초 : 폭탄설치되어있지 않은칸에 작업시작.
    	
    	//2초부터 N초까지 작업이 시작된다.
    	for(int time=2; time<=N;time++) {
    		
    		//시간이 짝수라면. 폭탄을 터뜨려야한다.
    		if( time % 2 == 0) {
    			for(int i=0;i<R;i++) {
    				for(int j=0;j<C;j++) {
    					if(map[i][j] == 'O') {
    						q.offer(new Node(i, j));
    					}
    				}
    			}
    			
    			//1초후의 값이 저장됨.
    			for(int i=0;i<R;i++) {
    				for(int j=0;j<C;j++) {
    					map[i][j] = 'O';
    				}
    			}
    			
    		}
    		
    		//시간이 홀수라면. 폭탄이 설치되어있지않은 모든 칸에 폭탄을 설치합니다.
    		if( time%2 == 1) { 			
    			BFS();
    		}
    	}
    	
		for(int i=0;i<R;i++) {
			for(int j=0;j<C;j++) {
				System.out.print(map[i][j]);
			}
			System.out.println();
		}
    	
    }
    public static void BFS() {
    	int[] dx = {-1,1,0,0};
    	int[] dy = {0,0,-1,1};
    	while(!q.isEmpty()) {
    		Node temp = q.poll();
    		int x = temp.r;
    		int y = temp.c;
    		map[x][y] = '.';
    		
    		for(int dir=0;dir<4;dir++) {
    			int nx = x + dx[dir];
    			int ny = y + dy[dir];
    			if(nx < 0 || nx >= R || ny < 0 || ny >= C) continue;
    			
    			map[nx][ny] = '.';
    		}
    	}
    }
    
}

class Node{
	int r;
	int c;
	public Node(int r, int c) {
		this.r = r;
		this.c = c;
	}
}

+ Recent posts