Coding - Algo/Java

[백준] 16918번:봄버맨(Java 자바)

jainn 2022. 2. 7. 11:44
728x90

문제

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

 

16918번: 봄버맨

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

www.acmicpc.net

 

 

풀이 및 소스코드

 

n=1 인 경우를 고려해줘야 한다.

안그러면 86%에서 틀려버림 ㅜㅜ..

그리고 0이 아니라 알파벳 O이다..ㅎㅎ...

 

곧 터져야하는 폭탄을 1, 새로운 폭탄을 2로 설정해서 구분을 해주면 금방 푸는 문제이다 !!

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();
        
        st = new StringTokenizer(br.readLine());
        int r = Integer.parseInt(st.nextToken());
        int c = Integer.parseInt(st.nextToken());
        int n = Integer.parseInt(st.nextToken());
        int[][] map = new int[r][c];
        for(int i=0;i<r;i++) {
        	String tmp = br.readLine();
        	for(int j=0;j<c;j++) {
        		if(tmp.charAt(j)=='.') {
        			map[i][j] = 0;
        		}else {
        			map[i][j] = 1;
        		}
        	}
        }
        
        int time = 1;
        int[] dx = {-1, 1, 0, 0};
        int[] dy = {0, 0, -1, 1};
        
        while(true) {
        	if(time>=n) break;
        	// n=1 일 때를 고려
        	
        	time ++;
        	// 1. 폭탄 설치
        	for(int i=0;i<r;i++) {
        		for (int j=0;j<c;j++) {
        			if (map[i][j]==0) {
        				map[i][j] = 2;
        			}
        		}
        	}
        	
        	if(time>=n) break;
        	// n초 만큼 시간이 흘렀는지 검사
        	
        	time++;
        	// 2. 폭탄 터트리기
        	for(int i=0;i<r;i++) {
        		for(int j=0;j<c;j++) {
        			if(map[i][j]==1) {
        				map[i][j] = 0;
        				// 2-(1). 주변 폭탄 터트리기
        				for(int k=0;k<4;k++) {
        					int nowx = dx[k]+i, nowy = dy[k]+j;
        					if(0>nowx||0>nowy||r<=nowx||c<=nowy) continue;
        					if(nowx>=i && nowy>=j && map[nowx][nowy]==1) continue;
        					map[nowx][nowy] = 0;
        				}
        			}else if(map[i][j]==2) {
        				map[i][j]--;
        			}
        		}
        	}
        	if(time>=n) break;
        	// n초 만큼 시간이 흘렀는지 검사
        }
        
        for(int i=0;i<r;i++) {
        	for(int j=0;j<c;j++) {
        		if(map[i][j]==0) {
        			sb.append(".");
        		}else {
        			sb.append("O");
        		}
        	}
        	sb.append("\n");
        }
        System.out.println(sb);
    }
    
}
반응형