1. 문제

www.acmicpc.net/problem/3019

 

3019번: 테트리스

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

www.acmicpc.net

2. 접근방법

맵과 타일모양을 줄 때 빈공간이 없게 두는 경우의 수를 구하는 문제

 

이 문제에서 타일에게 중요한 것은 빈공간이다.

그래서 나는 타일을 저장할 때

이런식으로 빈공간의 갯수만 세어서 저장하였다.

돌렸을 때의 모습들 역시 빈공간만 세어서 저장하였다.

이렇게 저장해두면

 

예시로 4번째 1 0 0 타일을 가지고 보았을 때

2 1 1 에서 모두 1씩 빼면 1 0 0 과 같은 모습이 된다.

이것을 바꿔서 보면 2 1 1 에서 1 0 0 을 뺐을 때 모두 같은 값이라면

놓을 수 있는 자리인 것이다.

이런식으로 빈칸을 채울수 있는지 검사하여 가능한 갯수를 구할 수 있다.

 

3. 자바 코드

package Silver;

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

public class P3019테트리스 {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int C = Integer.parseInt(st.nextToken());
		int P = Integer.parseInt(st.nextToken()) - 1;
		int shape[][][] = { { { 0 }, { 0, 0, 0, 0 } }, { { 0, 0 } }, { { 0, 0, 1 }, { 1, 0 } },
				{ { 1, 0, 0 }, { 0, 1 } }, { { 0, 0, 0 }, { 0, 1 }, { 1, 0, 1 }, { 1, 0 } },
				{ { 0, 0, 0 }, { 0, 0 }, { 0, 1, 1 }, { 2, 0 } }, { { 0, 0, 0 }, { 0, 0 }, { 1, 1, 0 }, { 0, 2 } } };
		st = new StringTokenizer(br.readLine());
		int map[] = new int[C];
		for (int i = 0; i < C; i++)
			map[i] = Integer.parseInt(st.nextToken());
		int cnt = 0;
		for (int i = 0; i < shape[P].length; i++)
			for (int j = 0; j < C - shape[P][i].length + 1; j++) {
				int diff = map[j] - shape[P][i][0];
				boolean ok = true;
				for (int k = 1; k < shape[P][i].length; k++)
					if (diff != map[j + k] - shape[P][i][k]) {
						ok = false;
						break;
					}
				if (ok)
					cnt++;
			}
		System.out.println(cnt);
	}

}

4. 마치며

괜찮은 문제였다.

 

 

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준] 20055 컨베이어 벨트 위의 로봇  (0) 2021.02.02
[백준] 4179 불!  (0) 2021.01.29
[백준] 15661 링크와 스타트  (3) 2021.01.24
[백준] 16988 Baaaaaaaaaduk2  (2) 2021.01.21
[백준] 20127 Y-수열  (0) 2021.01.18

+ Recent posts