본문 바로가기
알고리즘/백준

[백준] 18808. 스티커 붙이기

by vivi 2021. 11. 2.
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

댓글