알고리즘 문제풀이/백준
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;
}
}
반응형