[C#] 테트리스

소슬잎·2023년 11월 22일

백준 문제

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

풀이 후기

0. 잡담

갑자기 백준에 있는 테트리스 문제를 푸는 이유는 슬프기 때문이다. 근데 풀고보니까 다른 문제여서 하나 더 풀어야함.

1. 분석

테트로미노(그니까 블록)를 놓을 수 있는 경우의 수를 체크하는 문제. 행렬의 회전에 완전탐색을 해야할 것 같지만

블록이 떨어졌을 때, 
블록과 블록 또는 블록과 바닥 사이에
채워져있지 않은 칸이 생기면 안 된다.

요런 조건이 걸려있기 때문에 실질적으로 볼 것은 '블록의 아래 부분이 바닥과 딱 맞붙어 있는가?' 에 대해서만 집중하는 것이 핵심이다.

그렇기에 블록 배열을 만들 필요도 없고 '블록이 내려갈 바닥이 해당 블록의 바닥과 같은 모양인가?'가 된다.

그림으로 설명하자면, 흰색 O가 있는 부분이 바닥과 딱 붙을 수 있는지 신경쓰면 된다는 이야기.

2. 실행 결과


틀린 부분이 없었는데 왜 틀렸지하고 찾아보니까, 데이터 입력하는 코드를 오랫만에 짜서 11을 입력하면 1만 들어가게 짜놨다. 얌전히 int.Parse나 쓸 걸.

3. 코드

using System;
using System.Linq;

namespace 백준{
    public class Solution{
        public int[] floor;

        // i 블록
        public int b1(int len){
            // 일자는 기본적으로 모두 놓을 수 있음
            int answer = len;

            // 가로로 돌렸을 때 체크
            for(int i = 0; i <= len - 4; i++){
                bool flag = false;

                // 바닥이 4칸 평평한지 확인
                for(int j = 0; j < 4; j++){
                    // 한개라도 아니면 탈출
                    if(floor[i] != floor[i + j]){
                        flag = true;
                        break;
                    }
                }

                if(!flag){
                    answer++;
                }
            }

            return answer;
        }

        // o 블록
        public int b2(int len){
            int answer = 0;

            // 네모는 돌려도 같은 옆에 바닥만 체크
            for(int i = 0; i <= len - 2; i++){
                if(floor[i] == floor[i + 1]){
                    answer++;
                }
            }

            return answer;
        }

        // s 블록
        public int b3(int len){
            int answer = 0;

            // s 0
            for(int i = 0; i <= len - 3; i++){
                bool con1 = floor[i] == floor[i + 1];
                bool con2 = floor[i] + 1 == floor[i + 2];
                
                if(con1 && con2){
                    answer++;
                }
            }

            // s 90
            for(int i = 0; i <= len - 2; i++){
                bool con1 = floor[i] == floor[i + 1] + 1;
                
                if(con1){
                    answer++;
                }
            }

            return answer;
        }

        // z 블록
        public int b4(int len){
            int answer = 0;

            // z 0
            for(int i = 0; i <= len - 3; i++){
                bool con1 = floor[i + 1] == floor[i + 2];
                bool con2 = floor[i] - 1 == floor[i + 1];
                
                if(con1 && con2){
                    answer++;
                }
            }

            // z 90도
            for(int i = 0; i <= len - 2; i++){
                bool con1 = floor[i] == floor[i + 1] - 1;
                
                if(con1){
                    answer++;
                }
            }

            return answer;
        }

        // t 블록
        public int b5(int len){
            int answer = 0;

            // t 0
            for(int i = 0; i <= len - 3; i++){
                bool con1 = floor[i] == floor[i + 1];
                bool con2 = floor[i] == floor[i + 2];
                
                if(con1 && con2){
                    answer++;
                }
            }

            // t 90
            for(int i = 0; i <= len - 2; i++){
                bool con1 = floor[i] + 1 == floor[i + 1];
                
                if(con1){
                    answer++;
                }
            }

            // t 180
            for(int i = 0; i <= len - 3; i++){
                bool con1 = floor[i] == floor[i + 2];
                bool con2 = floor[i] - 1 == floor[i + 1];
                
                if(con1 && con2){
                    answer++;
                }
            }

            // t 270
            for(int i = 0; i <= len - 2; i++){
                bool con1 = floor[i] - 1 == floor[i + 1];
                
                if(con1){
                    answer++;
                }
            }


            return answer;
        }

        // L 블록
        public int b6(int len){
            int answer = 0;

            // l 0
            for(int i = 0; i <= len - 3; i++){
                bool con1 = floor[i] == floor[i + 1];
                bool con2 = floor[i] == floor[i + 2];
                
                if(con1 && con2){
                    answer++;
                }
            }

            // l 90
            for(int i = 0; i <= len - 2; i++){
                bool con1 = floor[i] == floor[i + 1];
                
                if(con1){
                    answer++;
                }
            }

            // l 180
            for(int i = 0; i <= len - 3; i++){
                bool con1 = floor[i] + 1 == floor[i + 1];
                bool con2 = floor[i + 1] == floor[i + 2];
                
                if(con1 && con2){
                    answer++;
                }
            }

            // l 270
            for(int i = 0; i <= len - 2; i++){
                bool con1 = floor[i] - 2 == floor[i + 1];
                
                if(con1){
                    answer++;
                }
            }

            return answer;
        }

        // j 블록
        public int b7(int len){
            int answer = 0;

            // j 0
            for(int i = 0; i <= len - 3; i++){
                bool con1 = floor[i] == floor[i + 1];
                bool con2 = floor[i] == floor[i + 2];
                
                if(con1 && con2){
                    answer++;
                }
            }

            // j 90
            for(int i = 0; i <= len - 2; i++){
                bool con1 = floor[i] == floor[i + 1] - 2;
                
                if(con1){
                    answer++;
                }
            }

            // j 180
            for(int i = 0; i <= len - 3; i++){
                bool con1 = floor[i] == floor[i + 1];
                bool con2 = floor[i] - 1 == floor[i + 2];
                
                if(con1 && con2){
                    answer++;
                }
            }

            // j 270
            for(int i = 0; i <= len - 2; i++){
                bool con1 = floor[i] == floor[i + 1];
                
                if(con1){
                    answer++;
                }
            }

            return answer;
        }

        public int solution(int len, int index, int[] floor){
            this.floor = floor;

            switch(index){
                case 1:
                    return b1(len);
                case 2:
                    return b2(len);
                case 3:
                    return b3(len);
                case 4:
                    return b4(len);
                case 5:
                    return b5(len);
                case 6:
                    return b6(len);
                case 7:
                    return b7(len);
                default:
                    return 0;
            }
        }

        public static void Main(){
            string inputS = Console.ReadLine();
            string floorS = Console.ReadLine();

            var inputSplit = inputS.Split(" ");
            var floorSplit = floorS.Split(" ");

            var len = int.Parse(inputSplit[0]);
            var index = int.Parse(inputSplit[1]);
            var floor = floorSplit.Select(int.Parse).ToArray();
            
            var answer = new Solution().solution(len, index, floor);
            Console.WriteLine(answer);
        }
    }
}
profile
그냥 바보

0개의 댓글