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;
}
}
'PS > 백준' 카테고리의 다른 글
[백준] 19237번 어른 상어 (Java) (0) | 2025.02.25 |
---|---|
[백준] 17472번 다리 만들기 2 (Java) (0) | 2025.02.16 |
[백준] 17837번 새로운 게임 2 (python) (0) | 2025.02.12 |
[백준] 2146번 다리 만들기 (python) (0) | 2025.01.09 |
[백준] 7576번 토마토 (python) (0) | 2024.12.30 |