본문 바로가기

알고리즘/시뮬

백준_PuyoPuyo_11559

문제 링크

조건

  • 게임 맵 크기 : 12 X 6
  • 같은 색 뿌요가 4개 이상 인접해 있으면 터짐 => 한 턴 마다 연쇄 수 ++

 

접근 방법

  • 시키는 대로 함
    • while문 돌리며, 같은 색 뿌요가 4개 이상 인접해 있는지 dfs로 체크
    • cnt가 4개 이상이면 터뜨림
    • 한 턴이 마무리되면 뿌요가 터져서 비워진 공간 전부 채워주고 연쇄 수를 1 더함

 

솔루션

public class Main_11559_PuyoPuyo {
	static int R,C;
	static char[][] map;
	static boolean[][] check;
	static int chain, cnt;
	static int[] dr = {-1,1,0,0};
	static int[] dc = {0,0,-1,1};
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		R = 12;
		C = 6;
		
		map = new char[R][C];
		check = new boolean[R][C];
		
		for(int i = 0; i < R; i++) {
			map[i] = br.readLine().trim().toCharArray();
		}
		
		while(true) {//터질거 있는지 확인
			boolean exist = false;
			for(int i = 0; i < R; i++) {
				for(int j = 0; j < C; j++) {
					if(map[i][j] != '.') {
						
						for(int k = 0; k < R; k++) Arrays.fill(check[k], false);
						cnt = 0;
						dfs(i,j);
						
						if(cnt > 3) {//터뜨릴 뿌요가 있다면
							exist = true;
							deletePuyo(i,j);
						}
					}
				}
			}
			
			if(!exist) break;
            //한 턴 마무리 됨
			pullDown();//비워진 공간 채우기
			chain++;//연쇄++
		}
		System.out.println(chain);
	}
	
	private static void deletePuyo(int r, int c) {
		for(int i = 0; i < R; i++) {
			for(int j = 0; j < C; j++) {
				if(check[i][j]) {//지워야 할 뿌요
					map[i][j] = '.';
				}
			}
		}
	}
	
	private static void pullDown() {
		int s = -1;
		
		for(int c = 0; c < C; c++) {
			s = -1;
			for(int r = R-1; r > -1; r--) {
				if(map[r][c] == '.') {
					if(s == -1) {//시작지점 찾음
						s = r;
					}
				}else {//뿌요 찾음
					if(s > -1) {//아래로 내려줌
						map[s--][c] = map[r][c];
						map[r][c] = '.';
					}
				}
			}
		}
	}
	
	private static void dfs(int r, int c) {
		int nr,nc;
		check[r][c] = true;//방문체크
		cnt++;
		
		for(int i = 0; i < 4; i++) {
			nr = r + dr[i];
			nc = c + dc[i];
			
			if(nr < 0 || nr >= R || nc < 0 || nc >= C
				|| check[nr][nc] || map[nr][nc] != map[r][c]) continue;
			
			dfs(nr,nc);
		}
	}
}

 

리뷰

  • 한 턴이 전부 마무리 되기 전까지 chain 수를 ++하면 안됨 (한 턴 동안 여러 그룹이 터질 수 있음)
  • 시뮬은 시키는대로만 잘 하면 된다는 걸 다시 느낌

'알고리즘 > 시뮬' 카테고리의 다른 글

백준_15685_드래곤 커브  (0) 2021.03.18
백준_20055_컨베이어 벨트 위의 로봇  (0) 2021.03.18
백준_미세먼지안녕!_17144  (0) 2021.01.25
백준_빗물_14719  (0) 2021.01.13