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;
}
}