Algorithm/시뮬레이션

BOJ#3019 테트리스

밤이2209 2017. 10. 18. 17:15

BOJ#3019 테트리스


* 문제




* 풀이

- 게임 규칙 : 블럭이 떨어졌을 때, 블럭과 바닥 사이에 채워져있지 않은 칸이 생기면 안된다.

- 풀이 방법 : 바닥 높이가 주어지고 블럭의 높이도 알 수 있으므로, 두 정보를 이용하면 빈 칸이 생기는지 알 수 있다.

,

평평한 바닥에 블럭을 놓았을 때 다음과 같이 블럭의 높이를 표현할 수 있습니다.

ㅗ -> "000"
ㅓ -> "10"
ㅏ -> "01"
ㅜ -> "101"

,

두 가지 경우를 그려보았습니다.

 

 

 

 

 

 

 

 


블럭 : "10"

블럭이 높이 1인 바닥에 놓여졌으므로 "10" -> "21"


블럭과 바닥 사이에 빈 칸이 있는가? = 각 col에 대해 블럭과 바닥 높이의 차이가 일정한지 검사


2 - 1 != 1 - 1


∴ FALSE



 

 

 

 

 

 

 

 



블럭 : "10"
블럭이 높이 1인 바닥에 놓여졌으므로 "10" -> "21"

블럭과 바닥 사이에 빈 칸이 있는가? = 각 col에 대해 블럭과 바닥 높이의 차이가 일정한지 검사

2 - 2 == 1 - 1

∴ TRUE


* 나의 코드

https://github.com/stack07142/BOJ/blob/e04833b62ad3a75946b454f5fc10c95cbdde2a85/BOJ%233019/src/Main.java



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

public class Main {

static int C, P;
static int[] height = new int[101];

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

// Input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());

C = Integer.parseInt(st.nextToken());
P = Integer.parseInt(st.nextToken());

st = new StringTokenizer(br.readLine());

for (int i = 0; i < C; i++) {

height[i] = Integer.parseInt(st.nextToken());
}

// Solve

int ret = 0;
switch (P) {

case 1:
ret = check("0") + check("0000");
break;

case 2:
ret = check("00");
break;

case 3:
ret = check("001") + check("10");
break;

case 4:
ret = check("100") + check("01");
break;

case 5:
ret = check("000") + check("01") + check("101") + check("10");
break;

case 6:
ret = check("000") + check("00") + check("011") + check("20");
break;

case 7:
ret = check("000") + check("00") + check("110") + check("02");
break;
}

System.out.println(ret);
}

static int check(String S) {

char[] tetrisHeight = S.toCharArray();
int n = tetrisHeight.length;

int ret = 0;
for (int col = 0; col <= C - n; col++) {

// col 위치에 따라 테트리스 높이에 basisColHeight가 일정하게 추가되어야 하는데,
// 테트리스 높이와 각 칸과의 차이가 일정한지만 검사하면 되므로 생략한다
/*

for (int i = 0; i < n; i++) {

tetrisHeight[i] += basisColHeight;
}
*/

boolean ok = true;
int diff = tetrisHeight[0] - height[col];

// 테트리스와 각 칸 사이에 공백이 있는지 확인( = 테트리스와 각 칸의 diff가 일정한지 확인)
for (int j = 0; j < n; j++) {

if (tetrisHeight[j] - height[col + j] != diff) ok = false;
}

if (ok) ret++;
}

return ret;
}
}


'Algorithm > 시뮬레이션' 카테고리의 다른 글

BOJ#4920 테트리스 게임  (0) 2017.10.17
BOJ#11559 Puyo Puyo  (0) 2017.09.21
BOJ#14503 로봇 청소기  (0) 2017.04.22
BOJ#3190 뱀  (5) 2017.04.15
BOJ#2931 가스관  (1) 2017.04.14