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
* 나의 코드
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 |