J

[JAVA] BOJ ๋ฐฑ์ค€ 20061 ๋ชจ๋…ธ๋ฏธ๋…ธ๋„๋ฏธ๋…ธ 2 ๋ณธ๋ฌธ

๐Ÿ”‘ Problem Solving/๐Ÿ’ป Samsung SW Expert

[JAVA] BOJ ๋ฐฑ์ค€ 20061 ๋ชจ๋…ธ๋ฏธ๋…ธ๋„๋ฏธ๋…ธ 2

snowball๐Ÿฐ 2023. 3. 5. 16:12

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

 

20061๋ฒˆ: ๋ชจ๋…ธ๋ฏธ๋…ธ๋„๋ฏธ๋…ธ 2

๋ชจ๋…ธ๋ฏธ๋…ธ๋„๋ฏธ๋…ธ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ƒ๊ธด ๋ณด๋“œ์—์„œ ์ง„ํ–‰๋˜๋Š” ๊ฒŒ์ž„์ด๋‹ค. ๋ณด๋“œ๋Š” ๋นจ๊ฐ„์ƒ‰ ๋ณด๋“œ, ํŒŒ๋ž€์ƒ‰ ๋ณด๋“œ, ์ดˆ๋ก์ƒ‰ ๋ณด๋“œ๊ฐ€ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋ถ™์–ด์žˆ๋Š” ํ˜•ํƒœ์ด๋‹ค. ๊ฒŒ์ž„์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ขŒํ‘œ (x, y)์—์„œ x๋Š” ํ–‰,

www.acmicpc.net

์ „์ฒด ์ฝ”๋“œ

import java.io.*;
import java.util.*;

public class BOJ_20061 {
	static int[][] map;
	static int result;
	public static void main(String[] args) throws Exception {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int N = Integer.parseInt(bf.readLine());
		map = new int[10][10];
		for(int i=0; i<N; i++) {
			StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
			int t = Integer.parseInt(st.nextToken());
			int x = Integer.parseInt(st.nextToken());
			int y = Integer.parseInt(st.nextToken());
			block(t, x, y);
		}
		int cnt = 0;
		for(int i=0; i<10; i++)
			for(int j=0 ;j<10; j++)
				if(map[i][j] == 1) cnt++;
		System.out.println(result);
		System.out.println(cnt);
	}
	static void block(int t, int x, int y) {
		if(t == 1) {
			// ํŒŒ๋ž€์ƒ‰ ์˜์—ญ
			int j = 0;
			for(j=4; j<=9; j++) {
				if(map[x][j] == 0) continue;
				break;
			}
			map[x][j-1] = 1;
			// ์ดˆ๋ก์ƒ‰ ์˜์—ญ
			int i=0;
			for(i=4; i<=9; i++) {
				if(map[i][y] == 0) continue;
				break;
			}
			map[i-1][y] = 1;
		}
		else if(t == 2) {
			// ํŒŒ๋ž€์ƒ‰ ์˜์—ญ
			int j=0;
			for(j=5; j<= 9; j++) {
				if(map[x][j] == 0 && map[x][j-1] == 0) continue;
				break;
			}
			map[x][j-1] = 1; map[x][j-2] = 1;
			// ์ดˆ๋ก์ƒ‰ ์˜์—ญ
			int i=0;
			for(i=4; i<= 9; i++) {
				if(map[i][y] == 0 && map[i][y+1] == 0) continue;
				break;
			}
			map[i-1][y] = 1; map[i-1][y+1] = 1;
		}
		else if(t == 3) {
			// ํŒŒ๋ž€์ƒ‰ ์˜์—ญ
			int j=0;
			for(j=4; j<=9; j++) {
				if(map[x][j] == 0 && map[x+1][j] == 0)
					continue;
				break;
			}
			map[x][j-1] = 1; map[x+1][j-1] = 1;
			// ์ดˆ๋ก์ƒ‰ ์˜์—ญ
			int i=0;
			for(i=5; i<= 9; i++) {
				if(map[i][y] == 0 && map[i-1][y] == 0) continue;
				break;
			}
			map[i-1][y] = 1; map[i-2][y] = 1;
		}
		score();
	}
	static void score() {
		// ํŒŒ๋ž€์ƒ‰ ์˜์—ญ์—์„œ ๊ฐ€๋“ ์ฐฌ ์—ด ์ฐพ๊ธฐ
		f: for(int j=6; j<=9; j++) {
			for(int i=0; i<4; i++) {
				if(map[i][j] == 0) continue f;
			}
			result++;
			for(int k = j; k>=5; k--) {
				for(int i=0; i<4; i++) {
					map[i][k] = map[i][k-1];
				}
			}
			for(int i=0; i<4; i++)
				map[i][4] = 0;
		}
		// ์ดˆ๋ก์ƒ‰ ์˜์—ญ์—์„œ ๊ฐ€๋“ ์ฐฌ ํ–‰ ์ฐพ๊ธฐ
		f: for(int i=6; i<=9; i++) {
			for(int j=0; j<4; j++) {
				if(map[i][j] == 0) continue f;
			}
			result++;
			for(int k = i; k>=5; k--) {
				map[k] = map[k-1];
			}
			map[4] = new int[10];
		}
		// ์—ฐํ•œ์ƒ‰ ์˜์—ญ์— ์นธ ๋น„์šฐ๊ธฐ
		// 1. ํŒŒ๋ž€์ƒ‰
		f: for(int j=4; j<=5; j++) {
			boolean flag = false;
			for(int i=0; i<4; i++) {
				if(map[i][j] == 1) {flag = true; break;}
			}
			if(flag) {
				for(int k = 9; k>j; k--) {
					for(int i=0; i<4; i++) {
						map[i][k] = map[i][k-1];
					}
				}
				for(int i=0; i<4; i++)
					map[i][j] = 0;
				}
			}
		// 2. ์ดˆ๋ก์ƒ‰
		f: for(int i=4; i<=5; i++) {
			boolean flag = false;
			for(int j=0; j<4; j++) {
				if(map[i][j] == 1) {flag = true; break;}
			}
			if(flag) {
				for(int k = 9; k>i; k--) {
					map[k] = map[k-1];
				}
				map[i] = new int[10];
			}
		}
	}
}

block() ์€ ์ž…๋ ฅ๋ฐ›์€ ๋ธ”๋ก์„ ํŒŒ๋ž€์ƒ‰ ์˜์—ญ๊ณผ ์ดˆ๋ก์ƒ‰ ์˜์—ญ์— ๋†“์•„์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

score() ๋Š” ๊ฝ‰ ์ฐฌ ํ–‰๊ณผ ์—ด์„ ํ™•์ธํ•œ ๋’ค ์ œ๊ฑฐํ•˜์—ฌ ์ ์ˆ˜๋ฅผ ์–ป๊ณ  ์—ฐํ•œ์ƒ‰ ์˜์—ญ์— ๋ธ”๋ก์ด ๋†“์—ฌ์žˆ๋Š”์ง€ ํ™•์ธํ•œ ๋’ค ๋ฏธ๋ค„์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

ํ•œ ์ค„์”ฉ ๋ณด์ž!

static int[][] map;
static int result;

์ „์—ญ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ๋ณ€์ˆ˜๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์ผ๋‹จ map์ด๋ผ๋Š” ์ด์ฐจ์› ๋ฐฐ์—ด์„ ํ†ตํ•ด ๋ธ”๋ก์ด ๋†“์—ฌ์žˆ๋Š” ๋ถ€๋ถ„์€ 1, ์•„๋‹Œ ๋ถ€๋ถ„์€ 0์œผ๋กœ ํ‘œ์‹œํ•  ๊ฒƒ์ด๋‹ค.

result๋ฅผ ํ†ตํ•ด ์ ์ˆ˜๋ฅผ ์ €์žฅํ•  ๊ฒƒ์ด๋‹ค.

map = new int[10][10];
for(int i=0; i<N; i++) {
	StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
	int t = Integer.parseInt(st.nextToken());
	int x = Integer.parseInt(st.nextToken());
	int y = Integer.parseInt(st.nextToken());
	block(t, x, y);
}

for๋ฌธ์„ ํ†ตํ•ด block ์ •๋ณด๋ฅผ ๋ฐ›์•„์„œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ด๋•Œ ์ž…๋ ฅ๋ฐ›์€ ๊ฐ’๋„ ์ธ๋ฑ์Šค๊ฐ€ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

int cnt = 0;
for(int i=0; i<10; i++)
	for(int j=0 ;j<10; j++)
		if(map[i][j] == 1) cnt++;
System.out.println(result);
System.out.println(cnt);

๋ธ”๋ก์„ ์˜ฎ๊ธฐ๊ณ  ์ ์ˆ˜ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด ๋๋‚˜๊ฒŒ ๋˜๋ฉด ์ด์ค‘ for๋ฌธ์œผ๋กœ ๋ธ”๋ก์„ ์„ธ์ค€๋‹ค. ๊ทธ ๋’ค ์ ์ˆ˜์™€ ๋‚จ์€ ๋ธ”๋ก์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

static void block(int t, int x, int y) {
		if(t == 1) {
			// ํŒŒ๋ž€์ƒ‰ ์˜์—ญ
			int j = 0;
			for(j=4; j<=9; j++) {
				if(map[x][j] == 0) continue;
				break;
			}
			map[x][j-1] = 1;
			// ์ดˆ๋ก์ƒ‰ ์˜์—ญ
			int i=0;
			for(i=4; i<=9; i++) {
				if(map[i][y] == 0) continue;
				break;
			}
			map[i-1][y] = 1;
		}

๋ธ”๋ก์ด 1์ธ ๊ฒฝ์šฐ๋Š” 1x1์งœ๋ฆฌ ๋ธ”๋ก์ด๋‹ค. ์šฐ๋ฆฌ๋Š” ํŒŒ๋ž€์ƒ‰ ์˜์—ญ์—์„œ ๋นจ๊ฐ„์ƒ‰ ์˜์—ญ์ด ๊ฐ€๊นŒ์šด ๊ณณ๋ถ€ํ„ฐ ์กฐ์‚ฌํ•˜์—ฌ ์–ด๋””์— ๋ธ”๋ก์„ ๋†“์•„์•ผํ•  ์ง€ ๊ฒฐ์ •ํ•  ๊ฒƒ์ด๋‹ค. ๋’ค์—์„œ ์–ธ๊ธ‰ํ•˜๊ฒ ์ง€๋งŒ ๋’ค์—์„œ๋ถ€ํ„ฐ ์กฐ์‚ฌํ•˜๊ฒŒ ๋˜๋ฉด ์—‰๋šฑํ•œ ๊ณณ์— ๋ธ”๋ก์„ ๋†“๊ฒŒ ๋จ์„ ์œ ์˜ํ•˜์ž!

for๋ฌธ ๋ฐ–์—์„œ๋„ j์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— i, j๋Š” for๋ฌธ ๋ฐ–์—์„œ ์„ ์–ธํ•œ ๋’ค ์‚ฌ์šฉํ•ด์ค€๋‹ค. ์•ž์—์„œ ๋ถ€ํ„ฐ ์กฐ์‚ฌํ•˜๋ฉฐ ์ฒ˜์Œ 0์ด์•„๋‹Œ ๊ฐ’์ด ๋‚˜์˜ค๋Š” ๊ณณ์„ ๋งŒ๋‚˜๋ฉด for๋ฌธ์„ ๋ฉˆ์ถ˜๋‹ค. ์ด๋•Œ ๋ธ”๋ก์ด ์ ์  ๋‚ด๋ ค์˜ค๋‹ค๊ฐ€ x, j์นธ์„ ๋งŒ๋‚˜๊ณ  ๋ธ”๋ก์€ ์ด๋™์„ ๋ฉˆ์ถ”๊ฒŒ ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ธ”๋ก์˜ ์œ„์น˜๋Š” ๊ทธ๋ณด๋‹ค ํ•œ ์นธ ์•ž์ธ x, j-1์นธ์ด ๋œ๋‹ค.

์ดˆ๋ก์ƒ‰ ์˜์—ญ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋ฏ€๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

else if(t == 2) {
	// ํŒŒ๋ž€์ƒ‰ ์˜์—ญ
	int j=0;
	for(j=5; j<= 9; j++) {
		if(map[x][j] == 0 && map[x][j-1] == 0) continue;
		break;
	}
	map[x][j-1] = 1; map[x][j-2] = 1;
	// ์ดˆ๋ก์ƒ‰ ์˜์—ญ
	int i=0;
	for(i=4; i<= 9; i++) {
		if(map[i][y] == 0 && map[i][y+1] == 0) continue;
		break;
	}
	map[i-1][y] = 1; map[i-1][y+1] = 1;
}

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ i, j๋Š” for ๋ฌธ ๋ฐ–์—์„œ ์„ ์–ธํ•ด์ค€๋‹ค.

ํŒŒ๋ž€์ƒ‰ ์˜์—ญ์€ ์•„๊นŒ์™€ ๋‹ฌ๋ฆฌ 5๋ถ€ํ„ฐ ์กฐ์‚ฌ๋ฅผ ์‹œ์ž‘ํ•˜๋Š”๋ฐ ๊ทธ ์ด์œ ๋Š” x, j์นธ๊ณผ x, j-1์นธ์„ ๋™์‹œ์— ์กฐ์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. j๋ฅผ 4๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ์กฐ๊ฑด์‹์„ 8๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  x, j์นธ๊ณผ x, j+1์นธ์„ ์กฐ์‚ฌํ•˜๋ฉด ๋œ๋‹ค. ์œ„์—์„œ์™€ ๊ฐ™์ด ๋‘ ์นธ์ด 0์ด๋ฉด ๋ธ”๋ก์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ์นธ์ด๋ฏ€๋กœ ๊ณ„์† continue๋ฅผ ํ•œ๋‹ค. ์ฒ˜์Œ์œผ๋กœ ๋ธ”๋ก์„ ๋†“์„ ์ˆ˜ ์—†๋Š” ์นธ์„ ๋งŒ๋‚˜๋ฉด ๋ธ”๋ก์€ ๋” ์ด์ƒ ๋’ค๋กœ ๊ฐˆ ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ ์ „์นธ์— ๋ธ”๋ก์„ ๋†“์•„์ค€๋‹ค.

์ดˆ๋ก์ƒ‰ ์˜์—ญ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค.

t๊ฐ€ 2์ผ ๋•Œ์™€ 3์ผ ๋•Œ๋Š” ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— 3์˜ ์„ค๋ช…์€ ์ƒ๋žตํ•  ๊ฒƒ์ด๋‹ค.

static void score() {
		// ํŒŒ๋ž€์ƒ‰ ์˜์—ญ์—์„œ ๊ฐ€๋“ ์ฐฌ ์—ด ์ฐพ๊ธฐ
		f: for(int j=6; j<=9; j++) {
			for(int i=0; i<4; i++) {
				if(map[i][j] == 0) continue f;
			}
			result++;
			for(int k = j; k>=5; k--) {
				for(int i=0; i<4; i++) {
					map[i][k] = map[i][k-1];
				}
			}
			for(int i=0; i<4; i++)
				map[i][4] = 0;
		}

์ด์ œ ์ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด์ค„ ๊ฒƒ์ด๋‹ค. ์ œ๊ฑฐ ํ•ด์ค„ ์—ด์€ 4์นธ์ด ๋ชจ๋‘ 1์ธ ์—ด์ด๋‹ค.

if๋ฌธ์„ ํ†ตํ•ด์„œ 4์นธ ์ค‘ ํ•˜๋‚˜๋ผ๋„ 0์ธ ๊ฐ’์ด ๋‚˜์˜ค๋ฉด (๋ธ”๋ก์ด ์—†๋Š” ์นธ) continue๋ฅผ ํ†ตํ•ด ๋‹ค์Œ ์—ด์„ ์กฐ์‚ฌํ•˜๊ฒŒ ํ•œ๋‹ค.

์ด๋•Œ 4์นธ์ด ๋ชจ๋‘ 1์ด๋ฉด continue๋˜์ง€ ์•Š๊ณ  ๋ฐ‘์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์ ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ์ฃผ๊ณ  ๋ธ”๋ก์„ ํ•œ์นธ์”ฉ ๋’ค๋กœ ๋ฐ€์–ด์ค€๋‹ค. 4์—ด์€ ์ „๋ถ€ ๋ฐ€๋ ค๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์— 0์œผ๋กœ ์ฑ„์šด๋‹ค.

// ์ดˆ๋ก์ƒ‰ ์˜์—ญ์—์„œ ๊ฐ€๋“ ์ฐฌ ํ–‰ ์ฐพ๊ธฐ
f: for(int i=6; i<=9; i++) {
	for(int j=0; j<4; j++) {
		if(map[i][j] == 0) continue f;
	}
	result++;
	for(int k = i; k>=5; k--) {
		map[k] = map[k-1];
	}
	map[4] = new int[10];
}

ํŒŒ๋ž€์ƒ‰ ์˜์—ญ๊ณผ ์ดˆ๋ก์ƒ‰ ์˜์—ญ์€ ํฌ๊ฒŒ ๋‹ค๋ฅธ ์ ์ด ์—†๋‹ค. ๋ธ”๋ก์„ ๋ฐ€์–ด์ฃผ๋Š” ์ฝ”๋“œ๊ฐ€ ๋น„๊ต์  ๊ฐ„๋‹จํ•˜๋‹ค.

// ์—ฐํ•œ์ƒ‰ ์˜์—ญ์— ์นธ ๋น„์šฐ๊ธฐ
// 1. ํŒŒ๋ž€์ƒ‰
f: for(int j=4; j<=5; j++) {
	boolean flag = false;
	for(int i=0; i<4; i++) {
		if(map[i][j] == 1) {flag = true; break;}
	}
	if(flag) {
		for(int k = 9; k>j; k--) {
			for(int i=0; i<4; i++) {
				map[i][k] = map[i][k-1];
			}
		}
		for(int i=0; i<4; i++)
			map[i][j] = 0;
		}
	}

for๋ฌธ์„ ํ†ตํ•ด 4์นธ ์ค‘์— ํ•˜๋‚˜๋ผ๋„ 1์ด๋ผ๋ฉด flag๋ฅผ true๋กœ ๋ฐ”๊พธ๊ณ  for๋ฌธ์„ ๋ฉˆ์ถ˜๋‹ค. ์กฐ์‚ฌํ•˜๋Š” ์—ด์— ๋ธ”๋ก์ด ์กด์žฌํ•œ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ ์•„๊นŒ์™€ ๊ฐ™์ด ํ•œ์นธ์”ฉ ๋’ค๋กœ ๋ฐ€์–ด์ค€๋‹ค. ๊ทธ ๋’ค ํ•ด๋‹น ์—ด์„ 0์œผ๋กœ ์ฑ„์šด๋‹ค.

์œ„์˜ ์ฝ”๋“œ์™€ ๋‹ค๋ฅธ ์ ์€ for๋ฌธ ๋ฐ‘์— ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ์ „๋ถ€ 0์œผ๋กœ ์ฑ„์›Œ์ ธ์žˆ์„ ๋•Œ์—๋„ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— flag๋ฅผ ํ†ตํ•ด ๊ตฌ๋ถ„์ ์„ ์ค˜์•ผํ•œ๋‹ค๋Š” ๊ฒƒ ๋ฟ์ด๋‹ค.

๐Ÿ’ก TIP : ๋’ค์—์„œ๋ถ€ํ„ฐ ์ฑ„์šฐ๊ฒŒ ๋˜๋ฉด 2๋กœ ํ‘œํ˜„๋˜์•ผ ํ•˜๋Š” ๊ฒŒ 1๋กœ ํ‘œํ˜„๋œ๋‹ค.

1๋ฒˆ
2๋ฒˆ

 

Comments