[백준] 20061번 모노미노도미노2 (java, 시뮬레이션)
728x90
반응형
미친 구현.. ㅎㅎ
옅은 영역과 보드가 모두 차는 경우 점수 계산 먼저하고 옅은 영역을 처리해준다.
이때 행을 밀게 되는데 옅은 영역번호 0,1 행 혹은 열에 해당하는 곳을 꼭 0으로 초기화해줘야된다.
점수를 계산할 때도 옅은 영역을 포함해서 밀어주되, 행 혹은 열이 0인 곳은 덮어씌워지지않으므로 꼭 0으로 초기화를
해줘야 된다.
나머지는 구현구현
import java.util.Scanner;
public class Main {
static int n,t,y,x;
static int[][] green=new int[6][4];
static int[][] blue=new int[4][6];
static int score;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
for (int i = 0; i < n; i++) {
t=sc.nextInt();
y=sc.nextInt();
x=sc.nextInt();
moveGreen(t,y,x);
// printGreen();
moveBlue(t,y,x);
// printBlue();
emptyGreen();
emptyBlue();
lightGreen();
lightBlue();
}
System.out.println(score);
int cnt=0;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 6; j++) {
if(blue[i][j]==1)cnt+=1;
}
}
int cnt2=0;
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 4; j++) {
if(green[i][j]==1)cnt+=1;
}
}
System.out.println(cnt+cnt2);
}
// private static void printBlue() {
// System.out.println("blue");
// for (int i = 0; i < 4; i++) {
// for (int j = 0; j < 6; j++) {
// System.out.print(blue[i][j]+" ");
// }
// System.out.println();
// }
// System.out.println();
// }
//
// private static void printGreen() {
// System.out.println("green");
// for (int i = 0; i < 6; i++) {
// for (int j = 0; j < 4; j++) {
// System.out.print(green[i][j]+" ");
// }
// System.out.println();
// }
// System.out.println();
// }
private static void lightBlue() {
int cnt=0;
for (int j = 0; j < 2; j++) {
for (int i = 0; i < 4; i++) {
if(blue[i][j]!=0) {
cnt+=1;//이 행에 블록이 있음
break;
}
}
}
//cnt 개수 만큼 밀기
for (int k = 5; k >=2; k--) {//행
for (int i = 0; i < 4; i++) {
blue[i][k]=blue[i][k-cnt];//오른쪽으로 쭉쭉 밀어
}
}
for (int j = 0; j < 2; j++) {
for (int i = 0; i < 4; i++) {
blue[i][j]=0;
}
}
}
private static void lightGreen() {
int cnt=0;
for (int j = 0; j < 2; j++) {
for (int i = 0; i < 4; i++) {
if(green[j][i]!=0) {
cnt+=1;//이 행에 블록이 있음
break;
}
}
}
//cnt 개수 만큼 밀기
for (int k = 5; k >=2; k--) {//열
for (int i = 0; i < 4; i++) {
green[k][i]=green[k-cnt][i];//아래쪽으로 쭉쭉 밀어
}
}
for (int j = 0; j < 2; j++) {
for (int i = 0; i < 4; i++) {
green[j][i]=0;
}
}
}
private static void emptyBlue() {
//없애고 옮겨
while(true) {
boolean flag=true;
for (int j = 5; j>=2; j--) {
int cnt=0;
for (int i = 0; i < 4; i++) {
if(blue[i][j]==1) {
cnt+=1;
}
}
if(cnt==4) {
score+=1;
flag=false;
for (int i = 0; i < 4; i++) {
blue[i][j]=0; //해당 열 모두 비워버림
}
for (int k = j-1; k >=0; k--) {//행
for (int i = 0; i < 4; i++) {
blue[i][k+1]=blue[i][k];//오른쪽으로 쭉쭉 밀어
}
}
for (int i = 0; i < 4; i++) {
blue[i][0]=0;
}
break;
}
}
if(flag)break;
}
}
private static void emptyGreen() {
while(true) {
boolean flag=true;
for (int j = 5; j>=2; j--) {
int cnt=0;
for (int i = 0; i < 4; i++) {
if(green[j][i]==1) {
cnt+=1;
}
}
if(cnt==4) {
score+=1;
flag=false;
for (int i = 0; i < 4; i++) {
green[j][i]=0; //해당 열 모두 비워버림
}
for (int k = j-1; k >=0; k--) {//행
for (int i = 0; i < 4; i++) {
green[k+1][i]=green[k][i];//아래쪽으로 쭉쭉 밀어
}
}
for (int i = 0; i < 4; i++) {
green[0][i]=0;
}
break;
}
}
if(flag)break;
}
}
private static void moveBlue(int type,int y,int x) {
if(type==1) {
int row=0;
for (int j = 0; j <=5; j++) {
if(blue[y][j]==0) {
row=j;
continue;
}else {
break;
}
}
blue[y][row]=1;
}else if(type==2) {
int row=0;
for (int j = 1; j<=5; j++) {
if(blue[y][j]==0 && blue[y][j-1]==0) {
row=j;
continue;
}else {
break;
}
}
blue[y][row]=1;
blue[y][row-1]=1;
}else {
int row=0;
for (int j = 0; j<=5; j++) {
if(blue[y][j]==0 && blue[y+1][j]==0) {
row=j;
continue;
}else {
break;
}
}
blue[y][row]=1;
blue[y+1][row]=1;
}
}
private static void moveGreen(int type,int y,int x) {
if(type==1) {
int col=0;
for (int i = 0; i <=5; i++) {
if(green[i][x]==0) {
col=i;
continue;
}else {
break;
}
}
green[col][x]=1;
}else if(type==2) {
int col=0;
for (int j = 0; j<=5; j++) {
if(green[j][x]==0 && green[j][x+1]==0) {
col=j;
continue;
}else {
break;
}
}
green[col][x]=1;
green[col][x+1]=1;
}else {
int col=0;
for (int j = 1; j<=5; j++) {
if(green[j][x]==0 && green[j-1][x]==0) {
col=j;
continue;
}else {
break;
}
}
green[col][x]=1;
green[col-1][x]=1;
}
}
}
728x90
반응형
'백준' 카테고리의 다른 글
[백준] 5567번 결혼식 (bfs, 구현 ) (0) | 2021.04.19 |
---|---|
[백준] 2573번 빙산 (java, 시뮬레이션, bfs) (0) | 2021.04.19 |
[백준] 19237번 어른 상어 (java, 시뮬레이션) (0) | 2021.04.19 |
[백준] 1138번 한 줄로 서기 (java, 구현) (0) | 2021.04.18 |
[백준] 17143번 낚시왕 (java, 시뮬레이션) (0) | 2021.04.18 |
TAGS.