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

[Java] BOJ 17136번 색종이 붙이기

by 컴공맨 2021. 6. 7.
 

17136번: 색종이 붙이기

<그림 1>과 같이 정사각형 모양을 한 다섯 종류의 색종이가 있다. 색종이의 크기는 1×1, 2×2, 3×3, 4×4, 5×5로 총 다섯 종류가 있으며, 각 종류의 색종이는 5개씩 가지고 있다. <그림 1> 색종이를 크

www.acmicpc.net


풀이

각 종이를 붙일 수 있는 모든 경우를 구해 해결했습니다.


코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	public static int answer;
	public static int[][] area = new int[10][10];
	public static int[] colorPaperCnt = {0, 5, 5, 5, 5, 5};
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		
		for (int i = 0; i < 10; ++i) {
			st = new StringTokenizer(br.readLine(), " ");
			for (int j = 0; j < 10; ++j) {
				area[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		answer = Integer.MAX_VALUE;
		go(0, 0, 0);
		answer = (answer == Integer.MAX_VALUE) ? -1 : answer;
		System.out.println(answer);
	}
	
	public static void go(int y, int x, int cnt) {
		if (y == 10) {
			for (int i = 0; i < 10; ++i) {
				for (int j = 0; j < 10; ++j) {
					if (area[i][j] > 0) {
						return;
					}
				}
			}
			
			answer = (answer > cnt) ? cnt : answer;
			return;
		}
		
		if (x >= 10) {
			go(y + 1, 0, cnt);
			return;
		}
		
		if (area[y][x] == 0) {
			go(y, x + 1, cnt);
		}
		else if (area[y][x] > 0) {
			for (int size = 5; size >= 1; size--) {
				if (!isPossible(y, x, size) || colorPaperCnt[size] <= 0) {
					continue;
				}
				
				colorPaperCnt[size]--;
				colorPaper(y, x, 0, size);
				go(y, x + 1, cnt + 1);
				colorPaperCnt[size]++;
				colorPaper(y, x, 1, size);
			}
		}
	}
	
	public static void colorPaper(int y, int x, int n, int size) {
		for (int i = y; i < y + size; ++i) {
			for (int j = x; j < x + size; ++j) {
				area[i][j] = n;
			}
		}
	}
	
	public static boolean isPossible(int y, int x, int size) {
		if (y + size > 10 || x + size > 10) {
			return false;
		}
		
		for (int i = y; i < y + size; ++i) {
			for (int j = x; j < x + size; ++j) {
				if (area[i][j] == 0) {
					return false;
				}
			}
		}
		
		return true;
	}
}

 

pyo7410/Algorithm

1일 1커밋을 목표로! Contribute to pyo7410/Algorithm development by creating an account on GitHub.

github.com

'알고리즘 > 백준' 카테고리의 다른 글

[Java] BOJ 14891번 톱니바퀴  (0) 2021.06.08
[Java] BOJ 2477번 참외밭  (0) 2021.06.07
[Java] BOJ 10163번 색종이  (0) 2021.06.07
[Java] BOJ 3055번 탈출  (0) 2021.06.07
[Java] BOJ 16933번 벽 부수고 이동하기 3  (0) 2021.06.03