본문 바로가기

[Algorithms]/[Problems]

BOJ. 20061번. 모노미노도미노 2

728x90

 

    구현 순서에 주의해서 풀면 그리 어렵지 않게 해결할 수 있다. 이전에는 구현문제에 애를 많이 먹었는데, 한두어달 문제를 조금씩 풀다보니 조금씩 익숙해지고 있는 중인 것 같다. 

    나는 초록색 구역과 파란색구역을 따로 나누지 않고, 초록색 테이블을 대각선으로 반전시키면 파란색과 초록색 테이블이 동일해진다는 아이디어를 가지고, 두가지 구역을 같은 로직으로 처리했다.

 

www.acmicpc.net/problem/20061

 

20061번: 모노미노도미노 2

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

www.acmicpc.net

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	static int n;
	static int[][] blue = new int[6][4];
	static int[][] green = new int[6][4];
	static int totalScore;
	public static void main(String[] args) throws NumberFormatException, IOException {
		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());
			int t = Integer.parseInt(st.nextToken());
			int y = Integer.parseInt(st.nextToken());
			int x = Integer.parseInt(st.nextToken());
			
			moveInMap(t, y, x, green);
			if(t==1) {
				moveInMap(1, x, y, blue);
			}else if(t==2) {
				moveInMap(3, x, y, blue);
			}else {
				moveInMap(2, x, y, blue);
			}
			gravity2(green);
			gravity2(blue);
		}
		
		System.out.println(totalScore);
		System.out.println(count());
	}
	
	private static void moveInMap(int t, int y, int x, int[][] map) {
		if(t==1) { // 1칸짜리인 경우
			// x좌표 고정, 최대한 내려본다.
			int yy = 0;
			while(true) {
				if(yy+1 > 5 || map[yy+1][x]==1) { break;}
				yy++;
			}
			map[yy][x]=1;
		}else if(t==2) { // 가로 2칸
			// x좌표 2개 고정 y,x  && y,x+1
			int yy=0;
			while(true) {
				if(yy+1 > 5 || map[yy+1][x]==1 || map[yy+1][x+1]==1 ){ break;} // 둘중 하나라도 다음좌표때 만나면
				yy++;
			}
			map[yy][x]=1;
			map[yy][x+1]=1;
		}else { // 세로로 두칸
			// x좌표 2개 고정 y,x  && y+1,x
			int yy = 0;
			while(true) {
				if(yy+1 > 5 || map[yy+1][x]==1) { break;}
				yy++;
			}
			map[yy-1][x]=1;
			map[yy][x]=1;
		}
		// 전부 놓고 나서, 4개인 열 있는지 체크
		for(int i=5; i>=2; i--) {
			int cnt=0;
			for(int j=0; j<4; j++) {
				if(map[i][j]==0) {
					break;
				}else {
					cnt++;
				}
			}
			if(cnt==4) {
				totalScore++;
				gravity(i,map);
				i++;
			}
		}
	}
	
	private static void gravity(int lineNum, int[][] map) {
		for(int i = lineNum; i > 0; i--) {
            for(int j = 0; j < 4; j++) {
            	map[i][j] = map[i-1][j];
            }
        }
	}
	
	private static void gravity2(int[][] map) {
		int count = 0;
        for(int i = 0; i < 2; i++) {
            for(int j = 0; j < 4; j++) {
            	if(map[i][j] == 1) {
                    count++;
                    break;
                }
            }
        }
        
        for(int i = 5; i >= 2; i--) {
            for(int j = 0; j < 4; j++) {
            	map[i][j] = map[i-count][j];	
            }
        }
        
        for(int i = 0; i < 2; i++) {
        	for(int j = 0; j < 4; j++) {
        		map[i][j] = 0;
        	}
        }
    }
	
	private static int count() {
        int count = 0;
        for(int i = 0; i < 4; i++) {
            for(int j = 0; j < 6; j++) {
                if(blue[j][i] == 1)
                    count++;
                if(green[j][i] == 1)
                    count++;
            }
        }
    
        return count;
    }
	

}
728x90

'[Algorithms] > [Problems]' 카테고리의 다른 글

BOJ. 1238번. 파티  (0) 2021.04.01
BOJ. 11780번. 플로이드 2  (0) 2021.03.30
BOJ. 1600번. 말이 되고픈 원숭이  (0) 2021.03.24
BOJ. 16637번. 괄호 추가하기  (0) 2021.03.21
BOJ. 2638번. 치즈  (0) 2021.03.19