1. 문제
2. 접근방법
맵과 타일모양을 줄 때 빈공간이 없게 두는 경우의 수를 구하는 문제
이 문제에서 타일에게 중요한 것은 빈공간이다.
그래서 나는 타일을 저장할 때
이런식으로 빈공간의 갯수만 세어서 저장하였다.
돌렸을 때의 모습들 역시 빈공간만 세어서 저장하였다.
이렇게 저장해두면
예시로 4번째 1 0 0 타일을 가지고 보았을 때
2 1 1 에서 모두 1씩 빼면 1 0 0 과 같은 모습이 된다.
이것을 바꿔서 보면 2 1 1 에서 1 0 0 을 뺐을 때 모두 같은 값이라면
놓을 수 있는 자리인 것이다.
이런식으로 빈칸을 채울수 있는지 검사하여 가능한 갯수를 구할 수 있다.
3. 자바 코드
package Silver;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class P3019테트리스 {
public static void main(String[] args) throws Exception {
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()) - 1;
int shape[][][] = { { { 0 }, { 0, 0, 0, 0 } }, { { 0, 0 } }, { { 0, 0, 1 }, { 1, 0 } },
{ { 1, 0, 0 }, { 0, 1 } }, { { 0, 0, 0 }, { 0, 1 }, { 1, 0, 1 }, { 1, 0 } },
{ { 0, 0, 0 }, { 0, 0 }, { 0, 1, 1 }, { 2, 0 } }, { { 0, 0, 0 }, { 0, 0 }, { 1, 1, 0 }, { 0, 2 } } };
st = new StringTokenizer(br.readLine());
int map[] = new int[C];
for (int i = 0; i < C; i++)
map[i] = Integer.parseInt(st.nextToken());
int cnt = 0;
for (int i = 0; i < shape[P].length; i++)
for (int j = 0; j < C - shape[P][i].length + 1; j++) {
int diff = map[j] - shape[P][i][0];
boolean ok = true;
for (int k = 1; k < shape[P][i].length; k++)
if (diff != map[j + k] - shape[P][i][k]) {
ok = false;
break;
}
if (ok)
cnt++;
}
System.out.println(cnt);
}
}
4. 마치며
괜찮은 문제였다.
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준] 20055 컨베이어 벨트 위의 로봇 (0) | 2021.02.02 |
---|---|
[백준] 4179 불! (0) | 2021.01.29 |
[백준] 15661 링크와 스타트 (3) | 2021.01.24 |
[백준] 16988 Baaaaaaaaaduk2 (2) | 2021.01.21 |
[백준] 20127 Y-수열 (0) | 2021.01.18 |