PS/백준

[백준] 20061번 모노미노도미노2 (Java)

yo0oni 2025. 3. 1. 20:36

 

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


저처럼 푸시면 안됩니다..

 

정답 코드

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

class Main {
	static int N;
	static int t, x, y;
	static int score = 0;
	static boolean[][] board = new boolean[10][10];

	public static void main(String args[]) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		N = Integer.parseInt(br.readLine());

		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			t = Integer.parseInt(st.nextToken());
			x = Integer.parseInt(st.nextToken());
			y = Integer.parseInt(st.nextToken());

			moveGreen(t, x, y);
			moveBlue(t, x, y);

			checkGreenFill();
			checkBlueFill();

			deleteGreen();
			deleteBlue();

		}
		System.out.println(score);
		System.out.println(countBlock());
	}

	private static void deleteBlue() {
		int hasBlockLine = 0;

		for (int j = 5; j > 3; j--) {
			for (int i = 0; i < 4; i++) {
				if (board[i][j]) {
					hasBlockLine++;
					break;
				}
			}
		}

		if (hasBlockLine == 1) {
			for (int j = 8; j > 4; j--) {
				for (int i = 0; i < 4; i++) {
					board[i][j + 1] = board[i][j];
				}
			}
			for (int i = 0; i < 4; i++) {
				board[i][5] = false;
			}
		} else if (hasBlockLine == 2) {
			for (int j = 7; j > 3; j--) {
				for (int i = 0; i < 4; i++) {
					board[i][j + 2] = board[i][j];
				}
			}
			for (int i = 0; i < 4; i++) {
				board[i][5] = false;
				board[i][4] = false;
			}
		}
	}

	private static void deleteGreen() {
		int hasBlockLine = 0;

		for (int i = 5; i > 3; i--) {
			for (int j = 0; j < 4; j++) {
				if (board[i][j]) {
					hasBlockLine++;
					break;
				}
			}
		}

		if (hasBlockLine == 1) {
			for (int i = 8; i > 4; i--) {
				for (int j = 0; j < 4; j++) {
					board[i + 1][j] = board[i][j];
				}
			}

			for (int j = 0; j < 4; j++) {
				board[5][j] = false;
			}
		} else if (hasBlockLine == 2) {
			for (int i = 7; i > 3; i--) {
				for (int j = 0; j < 4; j++) {
					board[i + 2][j] = board[i][j];
				}
			}
			for (int j = 0; j < 4; j++) {
				board[4][j] = false;
				board[5][j] = false;
			}
		}
	}

	private static void checkBlueFill() {
		for (int j = 6; j <= 9; j++) {
			boolean fill = true;

			// 현재 행이 완전히 차있는지 확인
			for (int i = 0; i < 4; i++) {
				if (!board[i][j]) {
					fill = false;
					break;
				}
			}

			if (fill) {
				score++;

				for (int k = j - 1; k >= 4; k--) {
					for (int i = 0; i < 4; i++) {
						board[i][k + 1] = board[i][k];
					}
				}

				for (int i = 0; i < 4; i++) {
					board[i][4] = false;
				}
			}
		}
	}

	private static void checkGreenFill() {
		// 6번 인덱스부터 9번 인덱스까지 순차적으로 탐색
		for (int i = 6; i <= 9; i++) {
			boolean fill = true;

			// 현재 행이 완전히 차있는지 확인
			for (int j = 0; j < 4; j++) {
				if (!board[i][j]) {
					fill = false;
					break;
				}
			}

			if (fill) {
				score++; // 행이 가득 찼으니 점수 증가

				for (int k = i - 1; k >= 4; k--) {
					for (int j = 0; j < 4; j++) {
						board[k + 1][j] = board[k][j];
					}
				}

				// 이동 후 초기화된 상태로 남은 빈 행을 false로 설정
				for (int j = 0; j < 4; j++) {
					board[4][j] = false;
				}
			}
		}
	}

	private static void moveBlue(int type, int ci, int cj) {
		if (t == 1) {
			while (cj < 9 && !board[ci][cj + 1]) {
				cj++;
			}
			board[ci][cj] = true;

		} else if (t == 2) {
			while (cj < 9 && !board[ci][cj + 1]) {
				cj++;
			}
			board[ci][cj] = true;
			board[ci][cj - 1] = true;
		} else if (t == 3) {
			while (ci < 9 && cj < 9 && !board[ci][cj + 1] && !board[ci + 1][cj + 1]) {
				cj++;
			}
			board[ci][cj] = true;
			board[ci + 1][cj] = true;
		}
	}

	private static void moveGreen(int type, int ci, int cj) {
		if (t == 1) {
			while (ci < 9 && !board[ci + 1][cj]) {
				ci++;
			}
			board[ci][cj] = true;

		} else if (t == 2) {
			while (ci < 9 && cj < 9 && !board[ci + 1][cj] && !board[ci + 1][cj + 1]) {
				ci++;
			}
			board[ci][cj] = true;
			board[ci][cj + 1] = true;

		} else if (t == 3) {
			while (ci < 9 && !board[ci + 1][cj]) {
				ci++;
			}
			board[ci][cj] = true;
			board[ci - 1][cj] = true;
		}
	}

	private static int countBlock() {
		int count = 0;

		for (int i = 6; i < 10; i++) {
			for (int j = 0; j < 4; j++) {
				if (board[i][j])
					count++;
			}
		}

		for (int i = 0; i < 4; i++) {
			for (int j = 6; j < 10; j++) {
				if (board[i][j])
					count++;
			}
		}

		return count;
	}
}