Lewis's Tech Keep
[백준] 스티커 붙이기 본문
참고 : www.acmicpc.net/problem/18808
- 시뮬레이션 문제
- 어려워서 풀이를 참고함.
- 각 기능을 원하는 대로 구현하는 능력을 키워야 함.
더보기
import java.util.*;
public class Main {
static int n, m, k;
static int[][] paper = new int[12][12];
static int r, c;
static int[][] note = new int[42][42];
private static void swapRC() {
int t = r;
r = c;
c = t;
}
private static void rotate() {
int[][] tmp = new int[12][12];
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
tmp[i][j] = paper[i][j];
}
}
for (int i = 0; i < c; i++) {
for (int j = 0; j < r; j++) {
paper[i][j] = tmp[r-1-j][i];
}
}
swapRC();
}
private static boolean isPassable(int x, int y) {
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
if(note[x+i][y+j] == 1 && paper[i][j] == 1) {
return false;
}
}
}
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
if(paper[i][j] == 1) {
note[x+i][y+j] = 1;
}
}
}
return true;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
k = sc.nextInt();
while(k-- > 0) {
r = sc.nextInt();
c = sc.nextInt();
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
paper[i][j] = sc.nextInt();
}
}
for (int rot = 0; rot < 4; rot++) {
boolean isPassable = false;
for (int x = 0; x <= n-r; x++) {
if(isPassable) break;
for (int y = 0; y <= m-c; y++) {
if(isPassable(x,y)) {
isPassable = true;
break;
}
}
}
if(isPassable) break;
rotate();
}
}
int cnt = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if(note[i][j] > 0) cnt++;
}
}
System.out.println(cnt);
}
}
'Java > 알고리즘' 카테고리의 다른 글
[백준] 2048 (easy) (0) | 2021.03.18 |
---|---|
[백준] 2048(easy) - 실패 (0) | 2021.03.16 |
[백준] 감시 (0) | 2021.03.13 |
[백준] 동전2 (0) | 2021.03.10 |
[백준] 파도반 수열 (0) | 2021.03.10 |
Comments