Coding Test

백준 테트리스(3019)

댕발바닥 2024. 3. 10. 23:13

구현에 가까운 문제를 풀었다.

 

https://www.acmicpc.net/problem/3019

 

3019번: 테트리스

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

www.acmicpc.net

 

위 문제는 선택된 블록이 바닥에 높이를 정해줬다.

 

시작부터 끝라인까지 순회하면 현재 높이로부터 블록을 쌓았는데 이후 높이들이 맞는지 확인한다.

 

총 블록이 7개가 존재하여 블록 별로 필요한 높이를 case별로 배열로 정리해두고 해당 검사 루프를 돌린 후 검사에 통과하였을 경우 개수를 증가시켜줬다.

 

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

/**
 * https://www.acmicpc.net/problem/3019
 */
public class Main {

    static int[][][] blocks = {
            {
                    {0},
                    {0, 0, 0, 0}

            },
            {
                    {0, 0}
            },
            {
                    {0, 0, 1},
                    {0, -1}
            },
            {
                    {0,-1,-1},
                    {0, 1}
            },
            {
                    {0,0,0},
                    {0, 1},
                    {0, -1, 0},
                    {0, -1}
            },
            {
                    {0, 0, 0},
                    {0, 0},
                    {0,1 ,1},
                    {0,-3}
            },
            {
                    {0, 0, 0},
                    {0, 3},
                    {0, 0, -1},
                    {0, 0}
            }
    };


    public static void main(String[] args) throws IOException {
        solution();
    }

    public static void solution() throws IOException {
        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());
        int[] height = new int[C];
        st = new StringTokenizer(br.readLine());
        for (int i=0; i < C; i++) {
            height[i] = Integer.parseInt(st.nextToken());
        }

        int sum = 0;
        int[][] validate = blocks[P-1];

        for (int i=0; i < validate.length; i++) {
            int[] vcase = validate[i];

            for (int w=0; w < C; w++) {
                int max = w + vcase.length - 1;

                if (max >= C) {
                    break;
                }

                int h = height[w];
                boolean flag = true;

                for (int k=0; k < vcase.length; k++) {
                    if (height[w+k] != h + vcase[k]) {
                        flag = false;
                        break;
                    }
                }

                if (flag) {
                    sum++;
                }
            }

        }

        System.out.println(sum);
    }



}

 

결과