https://www.acmicpc.net/problem/3019
갑자기 백준에 있는 테트리스 문제를 푸는 이유는 슬프기 때문이다. 근데 풀고보니까 다른 문제여서 하나 더 풀어야함.
테트로미노(그니까 블록)를 놓을 수 있는 경우의 수를 체크하는 문제. 행렬의 회전에 완전탐색을 해야할 것 같지만
블록이 떨어졌을 때,
블록과 블록 또는 블록과 바닥 사이에
채워져있지 않은 칸이 생기면 안 된다.
요런 조건이 걸려있기 때문에 실질적으로 볼 것은 '블록의 아래 부분이 바닥과 딱 맞붙어 있는가?' 에 대해서만 집중하는 것이 핵심이다.
그렇기에 블록 배열을 만들 필요도 없고 '블록이 내려갈 바닥이 해당 블록의 바닥과 같은 모양인가?'가 된다.

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

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