알고리즘 문제풀이/백준

Baekjoon_3019_테트리스

Treejin 2021. 1. 25. 21:21
반응형
문제 설명
 

3019번: 테트리스

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

www.acmicpc.net

 

  • 열의 크기 C
  • 블록 번호 P
  • 각 칸의 높이가 주어짐

=> 빈틈없이 P번 블록을 놓을 수 있는 경우의 수 출력

 

 

문제 풀이

이 문제는 '빈틈없이' 블록을 올려놓을 수 있는 경우의 수를 측정하는 문제이다.

 

따라서 블록을 회전시켰을 때 그 밑바닥의 구조가 가장 중요했다.

 

따라서 블록 별로 회전했을 때 밑바닥의 형태를 배열에 전부 입력했다.

ex) ㅜ 모양 블록 : 1 0 1, ㄴ모양 블록 : 0 0 0 등

 

그리고 각 열마다 블록을 배치했다고 가정한 후, (열의 높이 - 블록의 바닥) 값이 전부 같으면 블록을 빈틈없이 놓을 수 있다는 의미이므로 count 값을 증가시켰다.

 

문제 풀이 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class _3019_테트리스 {
	static int arr[];
	static int blocks[][][] = {
			{{0,0,0,0},{0}},	//1번 블록
			{{0,0}},		//2
			{{0,0,1},{1,0}},	//3
			{{1,0,0},{0,1}},	//4
			{{0,0,0},{1,0},{1,0,1},{0,1}},	//5
			{{0,0,0},{0,0},{0,1,1},{2,0}},	//6
			{{0,0,0},{0,0},{1,1,0},{0,2}}	//7
			};
	static int C,P,count = 0;
	public static void main(String[] args) throws IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(in.readLine());
		C = Integer.parseInt(st.nextToken());
		P = Integer.parseInt(st.nextToken())-1;
		arr = new int[C];
		st = new StringTokenizer(in.readLine());
		for(int i = 0; i<C;++i) {
			arr[i] = Integer.parseInt(st.nextToken());
		}
		
		for(int i = 0; i<blocks[P].length;++i) {	//P블록의 가능한 경우의 수
			solve(0,i);
		}
		
		System.out.println(count);
	}
	
	static void solve(int idx,int num) {
		if(idx + blocks[P][num].length > C) {	//블록이 놓일 수 있는 범위 밖이면
			return;
		}
		
		solve(idx+1,num);
		int height = arr[idx] - blocks[P][num][0];
		for(int i = 1; i<blocks[P][num].length;++i) {
			if(height != arr[idx+i]- blocks[P][num][i]) {	//높이가 일치하지 않으면 return
				return;
			}
		}
		++count;
		
	}
}

 

반응형