ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 3019 테트리스
    ALGORITHM/BOJ 2020. 11. 15. 20:21

    www.acmicpc.net/problem/3019

     

    3019번: 테트리스

    테트리스는 C열 필드위에서 플레이하는 유명한 게임이다. 필드의 행의 수는 무한하다. 한 번 움직일 때, 아래와 같은 일곱가지 블록 중 하나를 필드에 떨어뜨릴 수 있다. 블록을 떨어뜨리기 전에

    www.acmicpc.net

    2020-11-15


    import java.util.Scanner;
    
    public class Main3019 {
    	public static int C, P, arr[][], height[];
    	
    	public static int solve(int tmp[]) {
    		int count = 0;
    		
    		// 체크해야하는 테트리스 넓이만큼 빼고 계산
    		for(int i = 0; i <= C-tmp.length; i++) {
    			int num = height[i];
    			int cnt = 0;
    			
    			for(int j = 0; j < tmp.length-1; j++) {
    				if(tmp[0] >= tmp[j+1]) { // 기준 높이가 다음 높이보다 크거나 같을 때
    					int xx = tmp[0] - tmp[j+1];
    					if(num - xx >= 0) {
    						if(arr[num-xx][i+j+1] == 0) {
    							if(num-xx-1 == -1) cnt++; // 범위를 벗어나는 경우
    							if(num-xx-1 >= 0 && arr[num-xx-1][i+j+1] == 1) cnt++;
    						}
    					}
    				} else { // 기준 높이가 다음 높이보다 작을 떼
    					int xx = tmp[0] + tmp[j+1];
    					if(num + xx >= 0) {
    						if(arr[num+xx][i+j+1] == 0) {
    							if(num+xx-1 >= 0 && arr[num+xx-1][i+j+1] == 1) cnt++;
    						}
    					}
    				}
    			}
    			if(cnt == (tmp.length-1)) count++;
    		}
    		return count;
    	}
    	
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		C = sc.nextInt();
    		P = sc.nextInt();
    		
    		arr = new int[105][C];
    		height = new int[C];
    		
    		for(int i = 0; i < C; i++) {
    			height[i] = sc.nextInt(); 
    			for(int j = 0; j <= height[i] - 1; j++) {
    				arr[j][i]++;
    			}
    		}
    		
    		int answer = 0;
    		
    		switch(P) {
    			case 1:
    				answer += solve(new int[] {0});
    				answer += solve(new int[] {0, 0, 0, 0});
    				break;
    			case 2:
    				answer += solve(new int[] {0, 0});
    				break;
    			case 3: 
    				answer += solve(new int[] {0, 0, 1});
    				answer += solve(new int[] {1, 0});
    				break;
    			case 4:
    				answer += solve(new int[] {1, 0, 0});
    				answer += solve(new int[] {0, 1});
    				break;
    			case 5:
    				answer += solve(new int[] {0, 0, 0}); // ㅗ
    				answer += solve(new int[] {1, 0}); // ㅓ
    				answer += solve(new int[] {1, 0, 1}); // ㅜ
    				answer += solve(new int[] {0, 1}); // ㅏ
    				break;
    			case 6:
    				answer += solve(new int[] {0, 0, 0});
    				answer += solve(new int[] {2, 0});
    				answer += solve(new int[] {0, 1, 1});
    				answer += solve(new int[] {0, 0});
    				break;
    			case 7:
    				answer += solve(new int[] {0, 0, 0});
    				answer += solve(new int[] {0, 0});
    				answer += solve(new int[] {1, 1, 0});
    				answer += solve(new int[] {0, 2});
    				break;
    		}
    		System.out.println(answer);
    	}
    }

    몇 시간을 고민한 문제;;

     

    이것저것 시도해보다가 얼떨결에? 답이 맞았는데,,, 좋은 방법인지는 모르겠다.

     

     

    1. 높이 값만 받는 1차원 배열 하나와, 높이 만큼 1로 칠해주는 2차원 배열 하나를 만들었다.

     

    2. 가장 낮은 높이를 기준으로 0을 잡고 필요한 넓이 대 높이만큼 배열을 만들어준다.

     

    3. 전체 행 - 체크해야하는 테트리스 넓이만큼 for문을 돌면서 첫 번째 기준으로 높낮이를 체크하였다.

     3-1. 기준 높이 [0] 가 다른/다음 높이보다 크거나 같을 경우 계산을 해준다.

       - 마이너스를 해야하므로 범위를 벗어나는 부분도 체크했다.

     3-2. 기준 높이 [0] 가 다른/다음 높이보다 작을 경우 계산을 해준다.

     

     이 때, 현재 값이 0이면서 바로 아래 값이 1인 경우에만 count를 해주었다. 그리고 count 해 준 모든 값이 체크해야하는 테트리스 행의 길이 -1 과 같으면 경우의 수 하나로 쳤다.

     

    'ALGORITHM > BOJ' 카테고리의 다른 글

    [백준] 13549 숨바꼭질3  (0) 2020.11.16
    [백준] 1697 숨바꼭질  (0) 2020.11.16
    [백준] 1991 트리 순회  (0) 2020.11.15
    [백준] 1303 전쟁 - 전투  (0) 2020.11.15
    [백준] 1051 숫자 정사각형  (0) 2020.11.13

    댓글

Programming Diary