[BaekJoon] 16768 Mooyo Mooyo (Java)

SeongWon Ohยท2021๋…„ 10์›” 24์ผ
0
post-thumbnail

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

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


๐Ÿ“ ๋ฌธ์ œ ์„ค๋ช…

ํ•ด๋‹น ๋ฌธ์ œ๋Š” ๊ณผ๊ฑฐ ๋ฟŒ์š”๋ฟŒ์š” ๊ฒŒ์ž„์˜ pop์กฐ๊ฑด์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.
๋ฌธ์ œ์—์„œ๋Š” K๊ฐœ ์ด์ƒ์˜ ๊ฐ™์€ ์ˆ˜๊ฐ€ ๋ถ™์–ด์žˆ์œผ๋ฉด ํ•ด๋‹น ์ˆ˜๋“ค์€ ์‚ญ์ œ๊ฐ€ ๋˜๊ณ  ๊ฐ™์€ ๋ผ์ธ์— ์žˆ๋Š” ์ˆซ์ž๋“ค์ด ์•„๋ž˜๋กœ ๋‚ด๋ ค์˜ค๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๋ฉด ๋œ๋‹ค.

ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด์„œ๋Š” DFS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒ์ƒ‰์„ ํ•˜๋ฉฐ ์ฃผ๋ณ€์— ๊ฐ™์€ ์ˆ˜๋“ค์ด ๋ช‡๊ฐœ๊ฐ€ ์žˆ๋Š”์ง€ ํƒ์ƒ‰ ๋ฐ ํ•ด๋‹น ์œ„์น˜๋“ค์„ ์ €์žฅํ•˜๋ฉฐ ์ง„ํ–‰ํ•ด์•ผํ•œ๋‹ค.

๋งŒ์•ฝ ํƒ์ƒ‰์„ ํ•˜๋ฉฐ K๊ฐœ ์ด์ƒ์˜ ๋ธ”๋ก์ด ๋ถ™์–ด์žˆ๋‹ค๋ฉด ํ•ด๋‹น block์€ 0์œผ๋กœ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•œ ํ›„ ์œ„์˜ ๋ธ”๋ก๋“ค์„ ๋‚ด๋ ค์ฃผ๋„๋ก method๋“ค์„ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.


๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป ์ฒ˜์Œ ์ž‘์„ฑํ•œ ์ฝ”๋“œ (์‹คํŒจ)

์ฃผ์–ด์ง„ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ํ†ต๊ณผํ•˜๋‚˜ ํ…Œ์ŠคํŠธ์—์„œ๋Š” ์‹คํŒจ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค...๋ฐ˜๋ก€๋ฅผ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค๐Ÿ˜ฅ

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {
	static int[][] matrix;
	static boolean[][] check;
	static ArrayList<Integer> storeX;
	static ArrayList<Integer> storeY;
	static int[] dx = {-1, 1, 0, 0};
	static int[] dy = {0, 0, -1, 1};
	static int count;
	static int K;
	static int N;
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken());
		K = Integer.parseInt(st.nextToken());
		
		matrix = new int[N][10];
		for (int i=0; i<N; i++) {
			matrix[i] = Arrays.stream(br.readLine().split("")).mapToInt(Integer::parseInt).toArray();
		}
		
		// ์—†์–ด์ง€๋Š”๊ฒŒ ์—†์„ ๋•Œ๊นŒ์ง€ pop!!
		boolean flag = true;
		while (flag) {
			flag = pop();
		}
		
		for (int i=0; i<N; i++) {
			for (int j=0; j<10; j++) {
				bw.write(matrix[i][j]+ " ");
			}
			bw.write("\n");
		}
		bw.flush();
		bw.close();
		br.close();
		
	}
	static boolean pop() {
		// ๋‚ด๋ถ€ ํƒ์ƒ‰ํ•˜๋ฉฐ ๊ฐ™์€ ๊ฒƒ๋“ค popํ•˜๊ธฐ
		check = new boolean[N][10];
		boolean isPoped = false;
		for (int i=0; i<(10*N); i++) {
			int r = i/10;
			int c = i%10;
			
			// ํ•ด๋‹น ๊ฐ’์ด 0์ด๋ฉด pass
			if (matrix[r][c] == 0) continue;
			
			count = 0;
			storeX = new ArrayList<>();
			storeY = new ArrayList<>();
			// dfsํƒ์ƒ‰์„ ํ†ตํ•ด ์ฃผ๋ณ€์˜ ๊ฐ’๋“  ๊ฐ’๋“ค์ด ์œ„์น˜ํ•œ x,y๊ฐ’๋“ค ์ €์žฅ 
			dfs(r, c);
			if (count >= K) {
				for (int j=0; j<storeX.size(); j++) {
					int rx = storeX.get(j);
					int ry = storeY.get(j);
					matrix[rx][ry] = 0;
				}
				isPoped = true;
			}
		}
		if (isPoped) {
			// ์นธ ๋‚ด๋ฆฌ๋Š” ์ฝ”๋“œ ์ถ”๊ฐ€
			putFloor();
			return true;
		}
		else return false;
	}
	
	// dfs๋ฅผ ํ†ตํ•œ ์—ฐ๊ฒฐ๋œ ๋ถ€๋ถ„ ํƒ์ƒ‰
	static void dfs(int r, int c) {
		check[r][c] = true;
		storeX.add(r);
		storeY.add(c);
		count++;
		int value = matrix[r][c]; // ํ˜„์žฌ ์œ„์น˜์˜ ๊ฐ’
		for (int i=0; i<4; i++) {
			if (0 <= r+dx[i] && r+dx[i] < N && 0 <= c+dy[i] && c+dy[i] < 10) {
				if (!check[r+dx[i]][c+dy[i]] && matrix[r+dx[i]][c+dy[i]] == value) {
					dfs(r+dx[i], c+dy[i]);
				}
			}	
		}
	}
	
	static void putFloor() {
		for (int i=0; i< 10; i++) {
			boolean needChange = false;
			int savePosition = N-1;
			for (int j=N-1; j>=0; j--) {
				if (matrix[j][i]==0) {
					needChange = true;
				}
				if (needChange && matrix[j][i]!=0) {
					matrix[savePosition][i] = matrix[j][i];
					savePosition--;
					matrix[j][i] = 0;
				}
			}
		}
	}
}

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป ๋‘๋ฒˆ์งธ๋กœ ์ž‘์„ฑํ•œ ์ฝ”๋“œ (ํ†ต๊ณผ)

๊ฐœ๋ฐœํ•˜๋Š” ๊ณ ๋ผ๋‹ˆ๋‹˜์˜ ์ฝ”๋“œ๋ฅผ ์ฐธ์กฐํ•˜์˜€์Šต๋‹ˆ๋‹ค.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {

   static class Point{
      int x, y;
      public Point(int y, int x) {
         this.x = x;
         this.y = y;
      }
   }
   static Stack<Point> stack = new Stack<>();
   static int N,K,cnt;
   static int[] dy = {-1, 1, 0, 0}, dx = {0, 0, -1, 1};
   static int[][] matrix;
   static boolean[][] visited;
   
   public static void main(String[] args) throws IOException {
      // TODO Auto-generated method stub
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      StringTokenizer st = new StringTokenizer(br.readLine());
      
      N = Integer.parseInt(st.nextToken());
      K = Integer.parseInt(st.nextToken());
      
      matrix = new int[N+1][11];
      for (int i=1; i<=N; i++) {
         char[] str = br.readLine().toCharArray();
         for(int j=1; j<=10; j++) {
            matrix[i][j] = str[j-1] - '0';
         }
      }
      while(true) {
         visited = new boolean[N+1][11];
         boolean flag = false;
         
         downward();
         for (int i=N; i>0; i--) {
            for (int j=1; j<=10; j++) {
               if (visited[i][j] || matrix[i][j]==0) continue;
               stack.clear();
               cnt = 0;
               DFS(i, j, matrix[i][j]);
               
               if (cnt >= K) {
                  flag = true;
                  for (Point p:stack) matrix[p.y][p.x] = 0;
                  
               }
            }
         } 
         if (!flag) break;
      }
      
      StringBuilder sb = new StringBuilder();
      for (int i=1; i<=N; i++) {
         for (int j=1; j<=10; j++)
            sb.append(matrix[i][j]);
         sb.append("\n");
      }
      System.out.println(sb.toString());
   }
   
   static void downward() {
      for (int i= N-1; i>0; i--) {
         for (int j=1; j<=10; j++) {
            if (matrix[i][j] == 0 || matrix[i+1][j] != 0) continue;
            
            int z = i+1;
            while(z <= N && matrix[z][j] == 0) {
               matrix[z][j] = matrix[z-1][j];
               matrix[z-1][j] = 0;
               z++;
            }
         }
      }
   }
	   
   static void DFS (int y, int x, int value) {
      cnt++;
      visited[y][x] = true;
      stack.push(new Point(y,x));
      
      for (int a=0; a<4; a++) {
         int ny = y+dy[a];
         int nx = x+dx[a];
         
         if (ny < 1 || nx < 1 || ny > N || nx > 10 || visited[ny][nx] || matrix[ny][nx]!=value) continue;
         
         DFS(ny, nx, value);
      }
    }

}

profile
๋ธ”๋กœ๊ทธ ์ด์ „ํ–ˆ์Šต๋‹ˆ๋‹ค. -> https://seongwon.dev/

0๊ฐœ์˜ ๋Œ“๊ธ€