[백준] 20061번 모노미노도미노2 (java, 시뮬레이션)

728x90
반응형

www.acmicpc.net/problem/20061

 

20061번: 모노미노도미노 2

모노미노도미노는 아래와 같이 생긴 보드에서 진행되는 게임이다. 보드는 빨간색 보드, 파란색 보드, 초록색 보드가 그림과 같이 붙어있는 형태이다. 게임에서 사용하는 좌표 (x, y)에서 x는 행,

www.acmicpc.net

미친 구현.. ㅎㅎ 

옅은 영역과 보드가 모두 차는 경우 점수 계산 먼저하고 옅은 영역을 처리해준다. 

 

이때 행을 밀게 되는데 옅은 영역번호 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
반응형
TAGS.

Comments