import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
class Main {
public static int[][] rotate_sticker(int[][] sticker) {
int height = sticker.length;
int width = sticker[0].length;
int[][] rotated_sticker = new int[width][height];
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
rotated_sticker[i][height - j - 1] = sticker[j][i];
}
}
return rotated_sticker;
}
// 붙일 수 있는지 체크
public static boolean pastable(int[][] n, int[][] s, int x, int y) {
if (x + s[0].length > n[0].length)
return false;
if (y + s.length > n.length)
return false;
for (int i = 0; i < s.length; i++) {
for (int j = 0; j < s[0].length; j++) {
if (s[i][j] == 1 && n[y + i][x + j] == 1)
return false;
}
}
return true;
}
// 붙이기
public static void paste(int[][] n, int[][] s, int x, int y) {
for (int i = 0; i < s.length; i++) {
for (int j = 0; j < s[0].length; j++) {
if (s[i][j] == 1 && n[y + i][x + j] == 0)
n[y + i][x + j] = 1;
}
}
}
// 붙이는 과정
// 1. 붙일 수 있는지 체크
// 2. 붙일 수 있으면 붙이기
// 붙일 수 없으면 회전 시켜서 다시 체크
public static void put_sticker(int[][] n, int[][] s, int count) {
if (count == 4) {
return;
}
boolean isSticked = false;
for (int i = 0; i < n.length; i++) {
for (int j = 0; j < n[0].length; j++) {
if (pastable(n, s, j, i)) {
paste(n, s, j, i);
isSticked = true;
break;
}
}
if (isSticked)
break;
}
if (!isSticked) {
put_sticker(n, rotate_sticker(s), count + 1);
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[][] n = new int[N][M];
int numOfSticker = Integer.parseInt(st.nextToken());
for (int i = 0; i < numOfSticker; i++) {
st = new StringTokenizer(br.readLine(), " ");
int height = Integer.parseInt(st.nextToken());
int width = Integer.parseInt(st.nextToken());
int[][] sticker = new int[height][width];
for (int j = 0; j < height; j++) {
st = new StringTokenizer(br.readLine(), " ");
for (int k = 0; k < width; k++) {
sticker[j][k] = Integer.parseInt(st.nextToken());
}
}
put_sticker(n, sticker, 0);
}
int answer = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (n[i][j] == 1)
answer++;
}
}
System.out.println(answer);
br.close();
}
}
참고
2차원 시계방향 90도 배열 회전
public static int[][] rotate_sticker(int[][] sticker) {
int height = sticker.length;
int width = sticker[0].length;
int[][] rotated_sticker = new int[width][height];
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
rotated_sticker[i][height - j - 1] = sticker[j][i];
}
}
return rotated_sticker;
}
헷갈리면 그냥 종이에 좌표써두고 돌려보기.
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 2407. 조합 (0) | 2021.11.14 |
---|---|
[백준] 1918. 후위표기식 (0) | 2021.11.11 |
[백준] 1629. 곱셈 (0) | 2021.10.27 |
[백준] 5397. 키로거 (0) | 2021.10.27 |
[백준] 1406. 에디터 (0) | 2021.10.27 |
댓글