algorithm
백준 20061번 모노미노도미노2 문제풀이
dev-lab
2020. 11. 30. 18:00
반응형
20061번: 모노미노도미노 2
모노미노도미노는 아래와 같이 생긴 보드에서 진행되는 게임이다. 보드는 빨간색 보드, 파란색 보드, 초록색 보드가 그림과 같이 붙어있는 형태이다. 게임에서 사용하는 좌표 (x, y)에서 x는 행,
www.acmicpc.net
백준 모노미노도미노 소스코드 공유합니다.
효율적인 코드는 아니지만 막혀있는 사람들에게 도움이 되고자 공개합니다.
문제에서 주어지는 블럭을 90도로 돌려 같은 메소드로 초록, 파랑 블럭을 모두 처리하고 싶었지만 생각대로 되지 않아 각각 메소드를 만들어서 시뮬레이션 처리해주었습니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
private static int score;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
boolean[][] green = new boolean[10][4];
boolean[][] blue = new boolean[4][10];
StringTokenizer st = null;
for(int tc=0; tc<N; tc++) {
st = new StringTokenizer(br.readLine());
int t = Integer.parseInt(st.nextToken());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
//이동
greenMove(green, t, x, y);
blueMove(blue, t, x, y);
//빙고체크
greenCheck(green);
blueCheck(blue);
//특별영역체크
specialCheck(green, blue);
}
System.out.println(score);
int tileCnt = 0;
for (int i = 0; i < green.length; i++) {
for (int j = 0; j < green[i].length; j++) {
if(green[i][j]) {
tileCnt++;
}
if(blue[j][i]) {
tileCnt++;
}
}
}
System.out.println(tileCnt);
}
private static void specialCheck(boolean[][] green, boolean[][] blue) {
int removeGreenRow = 0;
for (int i = 4; i < 6; i++) {
boolean check = false;
for (int j = 0; j < green[i].length; j++) {
if(green[i][j]) {
check = true;
break;
}
}
if(check) {
removeGreenRow++;
}
}
for (int i = 0; i < removeGreenRow; i++) {
greenGravity(green, green.length-1);
}
int removeBlueCol = 0;
for (int col = 4; col < 6; col++) {
boolean check = false;
for (int row = 0; row < blue.length; row++) {
if(blue[row][col]) {
check = true;
break;
}
}
if(check) {
removeBlueCol++;
}
}
for (int i = 0; i < removeBlueCol; i++) {
blueGravity(blue, blue[0].length-1);
}
}
private static void blueCheck(boolean[][] blue) {
for (int col = 0; col < blue[0].length; col++) {
boolean check = true;
for (int row = 0; row < blue.length; row++) {
if(!blue[row][col]) {
check = false;
break;
}
}
if(check) {
score++;
blueGravity(blue, col);
}
}
}
private static void blueGravity(boolean[][] blue, int idx) {
for (int col = idx-1; col >= 0; col--) {
for (int row = 0; row < blue.length; row++) {
blue[row][col+1] = blue[row][col];
blue[row][col] = false;
}
}
}
private static void greenCheck(boolean[][] green) {
for (int i = 0; i < green.length; i++) {
boolean check = true;
for (int j = 0; j < green[i].length; j++) {
if(!green[i][j]) {
check = false;
break;
}
}
if(check) {
score++;
greenGravity(green, i);
}
}
}
private static void greenGravity(boolean[][] green, int idx) {
for (int i = idx-1; i >= 0; i--) {
for (int j = 0; j < green[i].length; j++) {
green[i+1][j] = green[i][j];
green[i][j] = false;
}
}
}
private static void blueMove(boolean[][] blue, int t, int x, int y) {
int ny = y;
if(t == 1) {
for (int i = y; i < blue[x].length; i++) {
if(blue[x][i]) {
break;
}else {
ny = i;
}
}
blue[x][ny] = true;
}else if(t == 2) {
for (int i = y; i < blue[x].length-1; i++) {
if(blue[x][i] || blue[x][i+1]) {
break;
}
ny = i;
}
blue[x][ny] = true;
blue[x][ny+1] = true;
}else if(t == 3) {
for (int i = y; i < blue[x].length; i++) {
if(blue[x][i] || blue[x+1][i]) {
break;
}
ny = i;
}
blue[x][ny] = true;
blue[x+1][ny] = true;
}
}
private static void greenMove(boolean[][] green, int t, int x, int y) {
int nx = x;
if(t == 1) {
for (int i = x; i < green.length; i++) {
if(green[i][y]) {
break;
}else {
nx = i;
}
}
green[nx][y] = true;
}else if(t == 2) {
for (int i = x; i < green.length; i++) {
if(green[i][y] || green[i][y+1]) {
break;
}
nx = i;
}
green[nx][y] = true;
green[nx][y+1] = true;
}else if(t == 3) {
for (int i = x; i < green.length-1; i++) {
if(green[i][y] || green[i+1][y]) {
break;
}
nx = i;
}
green[nx][y] = true;
green[nx+1][y] = true;
}
}
}
반응형