๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€

[๋ฐฑ์ค€ ์Šคํ„ฐ๋”” 11์ฃผ์ฐจ] 11559๋ฒˆ PuyoPuyo(๋ฟŒ์š”๋ฟŒ์š”) ๊ณจ๋“œ5 - ์ž๋ฐ”(JAVA) / ๊ตฌํ˜„/ ์‹œ๋ฎฌ๋ ˆ์ด์…˜/ BFS

๐Ÿ“‘ ๋ฌธ์ œ

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

 

11559๋ฒˆ: Puyo Puyo

์ด 12๊ฐœ์˜ ์ค„์— ํ•„๋“œ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, ๊ฐ ์ค„์—๋Š” 6๊ฐœ์˜ ๋ฌธ์ž๊ฐ€ ์žˆ๋‹ค. ์ด๋•Œ .์€ ๋นˆ๊ณต๊ฐ„์ด๊ณ  .์ด ์•„๋‹Œ๊ฒƒ์€ ๊ฐ๊ฐ์˜ ์ƒ‰๊น”์˜ ๋ฟŒ์š”๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. R์€ ๋นจ๊ฐ•, G๋Š” ์ดˆ๋ก, B๋Š” ํŒŒ๋ž‘, P๋Š” ๋ณด๋ผ, Y๋Š” ๋…ธ๋ž‘์ด๋‹ค.

www.acmicpc.net

๋”๋ณด๊ธฐ
๋”๋ณด๊ธฐ

๋ฌธ์ œ

 ๋ฟŒ์š”๋ฟŒ์š”์˜ ๋ฃฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 ํ•„๋“œ์— ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ƒ‰๊น”์˜ ๋ฟŒ์š”๋ฅผ ๋†“๋Š”๋‹ค. ๋ฟŒ์š”๋Š” ์ค‘๋ ฅ์˜ ์˜ํ–ฅ์„ ๋ฐ›์•„ ์•„๋ž˜์— ๋ฐ”๋‹ฅ์ด๋‚˜ ๋‹ค๋ฅธ ๋ฟŒ์š”๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ์•„๋ž˜๋กœ ๋–จ์–ด์ง„๋‹ค.

 ๋ฟŒ์š”๋ฅผ ๋†“๊ณ  ๋‚œ ํ›„, ๊ฐ™์€ ์ƒ‰ ๋ฟŒ์š”๊ฐ€ 4๊ฐœ ์ด์ƒ ์ƒํ•˜์ขŒ์šฐ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉด ์—ฐ๊ฒฐ๋œ ๊ฐ™์€ ์ƒ‰ ๋ฟŒ์š”๋“ค์ด ํ•œ๊บผ๋ฒˆ์— ์—†์–ด์ง„๋‹ค.  ์ด๋•Œ 1์—ฐ์‡„๊ฐ€ ์‹œ์ž‘๋œ๋‹ค.

 ๋ฟŒ์š”๋“ค์ด ์—†์–ด์ง€๊ณ  ๋‚˜์„œ ์œ„์— ๋‹ค๋ฅธ ๋ฟŒ์š”๋“ค์ด ์žˆ๋‹ค๋ฉด, ์—ญ์‹œ ์ค‘๋ ฅ์˜ ์˜ํ–ฅ์„ ๋ฐ›์•„ ์ฐจ๋ก€๋Œ€๋กœ ์•„๋ž˜๋กœ ๋–จ์–ด์ง€๊ฒŒ ๋œ๋‹ค.

 ์•„๋ž˜๋กœ ๋–จ์–ด์ง€๊ณ  ๋‚˜์„œ ๋‹ค์‹œ ๊ฐ™์€ ์ƒ‰์˜ ๋ฟŒ์š”๋“ค์ด 4๊ฐœ ์ด์ƒ ๋ชจ์ด๊ฒŒ ๋˜๋ฉด ๋˜ ํ„ฐ์ง€๊ฒŒ ๋˜๋Š”๋ฐ, ํ„ฐ์ง„ ํ›„ ๋ฟŒ์š”๋“ค์ด ๋‚ด๋ ค์˜ค๊ณ  ๋‹ค์‹œ ํ„ฐ์ง์„ ๋ฐ˜๋ณตํ•  ๋•Œ๋งˆ๋‹ค 1์—ฐ์‡„์”ฉ ๋Š˜์–ด๋‚œ๋‹ค.

 ํ„ฐ์งˆ ์ˆ˜ ์žˆ๋Š” ๋ฟŒ์š”๊ฐ€ ์—ฌ๋Ÿฌ ๊ทธ๋ฃน์ด ์žˆ๋‹ค๋ฉด ๋™์‹œ์— ํ„ฐ์ ธ์•ผ ํ•˜๊ณ  ์—ฌ๋Ÿฌ ๊ทธ๋ฃน์ด ํ„ฐ์ง€๋”๋ผ๋„ ํ•œ๋ฒˆ์˜ ์—ฐ์‡„๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค.

 ๋‚จ๊ทœ๋Š” ์ตœ๊ทผ ๋ฟŒ์š”๋ฟŒ์š” ๊ฒŒ์ž„์— ํ‘น ๋น ์กŒ๋‹ค. ์ด ๊ฒŒ์ž„์€ 1:1๋กœ ๋ถ™๋Š” ๋Œ€์ „๊ฒŒ์ž„์ด๋ผ ์ž˜ ์Œ“๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ, ์ƒ๋Œ€๋ฐฉ์ด ํ„ฐ๋œจ๋ฆฐ๋‹ค๋ฉด ์—ฐ์‡„๊ฐ€ ๋ช‡ ๋ฒˆ์ด ๋ ์ง€ ๋ฐ”๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ๋„ ํ•„์š”ํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์•„์ง ์‹ค๋ ฅ์ด ๋ถ€์กฑํ•˜์—ฌ ๋‚จ๊ทœ๋Š” ์ž๊ธฐ ํ•„๋“œ์—๋งŒ ์‹ ๊ฒฝ ์“ฐ๊ธฐ ๋ฐ”์˜๋‹ค. ์ƒ๋Œ€๋ฐฉ์˜ ํ•„๋“œ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์—ฐ์‡„๊ฐ€ ๋ช‡ ๋ฒˆ ์—ฐ์†์œผ๋กœ ์ผ์–ด๋‚ ์ง€ ๊ณ„์‚ฐํ•˜์—ฌ ๋‚จ๊ทœ๋ฅผ ๋„์™€์ฃผ์ž!

์ž…๋ ฅ

์ด 12๊ฐœ์˜ ์ค„์— ํ•„๋“œ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, ๊ฐ ์ค„์—๋Š” 6๊ฐœ์˜ ๋ฌธ์ž๊ฐ€ ์žˆ๋‹ค.

์ด๋•Œ .์€ ๋นˆ๊ณต๊ฐ„์ด๊ณ  .์ด ์•„๋‹Œ๊ฒƒ์€ ๊ฐ๊ฐ์˜ ์ƒ‰๊น”์˜ ๋ฟŒ์š”๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

R์€ ๋นจ๊ฐ•, G๋Š” ์ดˆ๋ก, B๋Š” ํŒŒ๋ž‘, P๋Š” ๋ณด๋ผ, Y๋Š” ๋…ธ๋ž‘์ด๋‹ค.

์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ํ•„๋“œ๋Š” ๋ฟŒ์š”๋“ค์ด ์ „๋ถ€ ์•„๋ž˜๋กœ ๋–จ์–ด์ง„ ๋’ค์˜ ์ƒํƒœ์ด๋‹ค. ์ฆ‰, ๋ฟŒ์š” ์•„๋ž˜์— ๋นˆ ์นธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

์ถœ๋ ฅ

ํ˜„์žฌ ์ฃผ์–ด์ง„ ์ƒํ™ฉ์—์„œ ๋ช‡์—ฐ์‡„๊ฐ€ ๋˜๋Š”์ง€ ์ถœ๋ ฅํ•œ๋‹ค. ํ•˜๋‚˜๋„ ํ„ฐ์ง€์ง€ ์•Š๋Š”๋‹ค๋ฉด 0์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

 

 

 

 

 

 

 

โœ’๏ธ ํ’€์ด

๐Ÿ’ก ์—ฐ์‡„๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊ฐœ๋…์„ ์ œ๋Œ€๋กœ ์žก๊ณ  ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ํ•œ "๋ฌถ์Œ"์„ ํ„ฐํŠธ๋ฆฌ๋Š”๊ฒŒ ์•„๋‹ˆ๋‹ค. "๋ฌถ์Œ๋“ค"์ด ๋ชจ๋‘ ํ„ฐ์ง€๊ณ  ๋‚˜์•ผ 1 ์—ฐ์‡„๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 1. ์™„์ „ํƒ์ƒ‰์œผ๋กœ ๋ฟŒ์š”๋ฅผ ์ฐพ์•„๋‚ธ๋‹ค.

 2. ๋ฟŒ์š”๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด BFS๋กœ ์‚ฌ๋ฐฉ์„ ํ™•์ธํ•˜์—ฌ ๊ฐ™์€ ์ƒ‰ ๋ฟŒ์š”๋ฅผ ์ฐพ๋Š”๋‹ค. ์ด๋•Œ ๊ฐ™์€์ƒ‰ ๋ฟŒ์š”๊ฐ€ 4๊ฐœ ์ด์ƒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉด ํ•˜๋‚˜์˜ "๋ฌถ์Œ"์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ํ„ฐํŠธ๋ฆฐ ํ›„, group๋ณ€์ˆ˜ ์นด์šดํŠธ๋ฅผ ๋Š˜๋ฆฐ๋‹ค. ์ „์ฒด ์™„ํƒ์—์„œ ํ•˜๋‚˜์˜ ๊ทธ๋ฃน์„ ์ฐพ์„ ๋•Œ ๋ฐ”๋กœ ํ„ฐํŠธ๋ฆฌ๊ฒŒ ๋˜๋ฏ€๋กœ, ๊ฐ™์€ ๊ทธ๋ฃน์ด ์ค‘๋ณต์œผ๋กœ ํ„ฐ์งˆ ์ผ์€ ์—†๋‹ค.

 3. ์™„ํƒ์„ ๋๋ƒˆ์„ ๋•Œ group ๋ณ€์ˆ˜๊ฐ€ 1 ์ด์ƒ์ด๋ฉด 1 ์—ฐ์‡„๋ฅผ ํ™•์ •์ง“๋Š”๋‹ค.

 4. ๋ฟŒ์š”๋ฅผ ๋ชจ๋‘ ํ„ฐํŠธ๋ฆฌ๊ณ  ๋‚œ ํ›„์—๋Š” ๋นˆ ๊ณต๊ฐ„์„ ๋ฉ”์›Œ์ค˜์•ผ ํ•œ๋‹ค. ์„ธ๋กœ๋กœ ํ•œ ์ค„์”ฉ ๋งจ ์•„๋ž˜์—์„œ๋ถ€ํ„ฐ ๋นˆ ๊ณต๊ฐ„์„ ์ฐพ์•„๋‚ธ ํ›„, ๋ฟŒ์š”๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉด ์•„๋ž˜ ๋นˆ ๊ณต๊ฐ„์— ๋„ฃ์–ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฉ”์šด๋‹ค. ์ด ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ๋Š” ์ง์ ‘ ํ•˜๋‚˜์”ฉ ์ผ€์ด์Šค๋ฅผ ๊ทธ๋ ค์„œ ์ธ๋ฑ์Šค๋ฅผ ์กฐ์ ˆํ•ด๋ด์•ผ ์ดํ•ด๊ฐ€ ๊ฐ„๋‹ค.

 

 

 

 

 

 

 

๐Ÿ’ป ์†Œ์Šค์ฝ”๋“œ: ์ž๋ฐ”(Java)

public class Main_๋ฐฑ์ค€_11559_PuyoPuyo_๊ณจ๋“œV {

	static int H=12, W=6;
	static char[][] map;
	static int[] dr = {1,-1,0,0};
	static int[] dc = {0,0,1,-1};
	static Queue<int[]> queue;
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		map = new char[H][W];
		queue = new LinkedList<int[]>();
		
		for (int i = 0; i < H; i++) {
			String str = br.readLine();
			for (int j = 0; j < W; j++) {
				map[i][j] = str.charAt(j);
			}
		}//input
		
		int result = 0;
		while(true) {
			if(!countBomb()) break; // ์—ฐ์‡„๊ฐ€ ์—†์œผ๋ฉด ๋ฃจํ”„๋ฅผ ๋‚˜์˜จ๋‹ค.
			result++;
		}
		System.out.println(result);
	}//end of main
	
	private static boolean countBomb() {
		int group = 0;	// ํ„ฐํŠธ๋ฆด ๊ทธ๋ฃน์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•  ์นด์šดํŠธ๋ณ€์ˆ˜
		for (int i = H-1; i >=0 ; i--) {
			for (int j = 0; j < W; j++) {
				if(map[i][j]!='.') {	// ๋ฟŒ์š” ๋ฐœ๊ฒฌ
					if(findMember(i,j)) group++;
				}
			}
		}
		if(group==0) return false;
		else {	// ์—ฐ์‡„๊ฐ€ ์กด์žฌํ•˜๋ฉด
			gravity(); // ํ„ฐํŠธ๋ฆฐ ๋ฟŒ์š”๋ฅผ ๋–จ์–ดํŠธ๋ฆฌ๊ธฐ
			return true;
		}
	}// end of countBomb
	
    // ํŠน์ • ์œ„์น˜์˜ ๋ฟŒ์š”๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ๋ฐฉ์— ๊ฐ™์€์ƒ‰ ๋ฟŒ์š”๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ
	private static boolean findMember(int r, int c) {
		boolean[][] visited = new boolean[H][W];
		visited[r][c] = true;
		queue.offer(new int[] {r,c});
		
		char puyo = map[r][c]; // ํ˜„์žฌ ๋ฟŒ์š” ์ƒ‰
		int cnt=1, nr, nc;
		while(queue.size()>0) {
			int[] cur = queue.poll();
			for (int i = 0; i < 4; i++) {
				nr = cur[0] + dr[i];
				nc = cur[1] + dc[i];
				if(nr<0||nc<0||nr>=H||nc>=W||visited[nr][nc]) continue;
				if(map[nr][nc]==puyo) {
					cnt++;
					visited[nr][nc]=true;
					queue.offer(new int[] {nr,nc});
				}
			}
		}
		if(cnt>=4) {
			pang(visited);	// ์ฒดํฌํ•œ ๊ฐ™์€์ƒ‰ ๋ฟŒ์š”๋ฅผ ํ„ฐํŠธ๋ฆฐ๋‹ค
			return true;
		}else return false;
	}// end of findMember
	
	private static void pang(boolean[][] visited) {
		for (int i = 0; i < H; i++) {
			for (int j = 0; j < W; j++) {
				if(visited[i][j]) map[i][j]='.';
			}
		}
	}// end of pang
	
	private static void gravity() {
		for (int i = 0; i < W; i++) {
			int start=-1;
			for (int j = H-1; j >= 0; j--) {
				if(start==-1) {
					if(map[j][i]=='.') start=j; // ๋นˆ ๊ณต๊ฐ„ ์ธ๋ฑ์Šค ์ฐพ๊ธฐ
				}else {
					if(map[j][i]!='.') { // ๋ฟŒ์š”๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด
						map[start--][i] = map[j][i]; // ๋นˆ ๊ณต๊ฐ„์œผ๋กœ ๋ฐ€์–ด์ฃผ๊ณ 
						map[j][i] = '.'; // ํ˜„์žฌ ๋ฟŒ์š” ์œ„์น˜๋Š” ๋นˆ ๊ณต๊ฐ„์œผ๋กœ ๋งŒ๋“ ๋‹ค
					}
				}
			}
		}
	}// end of gravity
}//end of class

 

 

 

 

 

 

 

 

 

 

 

๐Ÿ’Ž ๐Ÿ’Ž ๐Ÿ’Ž

 

 

๏ผฐ๏ฝ๏ฝ“๏ฝ”๏ฝ…๏ฝ„ ๏ผข๏ฝ™ ๏ผณ๏ผก๏ผน

๐˜›๐˜ฉ๐˜ข๐˜ฏ๐˜ฌ๐˜ด ๐˜ง๐˜ฐ๐˜ณ ๐˜ณ๐˜ฆ๐˜ข๐˜ฅ๐˜ช๐˜ฏ๐˜จ