본문 바로가기
알고리즘/문제풀이

[Java] 백준 14500 : 테트로미노

by abcodef 2022. 6. 23.

🔗 문제 내용


https://www.acmicpc.net/problem/14500
​​

 

14500번: 테트로미노

폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변

www.acmicpc.net

🌱 문제 풀이 방법


나올 수 있는 모든 테트로미노를 구해서 최댓값을 찾는 방식으로 풀었다.
나올 수 있는 모든 테트로미노는 아래와 같다. 19가지 모양의 도형이 나온다.

(0,0)부터 (N-1,M-1)까지 19개의 테트로미노를 대입해본다.

테트로미노가 배열의 범위를 초과하지 않는다면, 최댓값을 구했다.

🤔 공부가 필요한 부분


지금은 테트로미노(4-오미노)지만, 펜토미노(5-오미노)와 같이 나올 수 있는 도형의 경우의 수가 더 다양해진다면 아래 코드처럼 모든 도형을 확인하기에는 한계가 있을 수 있다.  

다른 풀이를 고민해야 한다.

💻 코드

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

public class Main_14500_테트로미노 {

	// 나올 수 있는 19개의 테트로미노의 좌표
	static int[][][] tetromino = { { { 0, 0 }, { 0, 1 }, { 0, 2 }, { 0, 3 } },
			{ { 0, 0 }, { 1, 0 }, { 2, 0 }, { 3, 0 } }, { { 0, 0 }, { 0, 1 }, { 1, 0 }, { 1, 1 } },
			{ { 0, 0 }, { 1, 0 }, { 2, 0 }, { 2, 1 } }, { { 2, 0 }, { 2, 1 }, { 1, 1 }, { 0, 1 } },
			{ { 0, 0 }, { 0, 1 }, { 0, 2 }, { 1, 0 } }, { { 0, 0 }, { 0, 1 }, { 0, 2 }, { 1, 2 } },
			{ { 0, 0 }, { 0, 1 }, { 1, 0 }, { 2, 0 } }, { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 } },
			{ { 0, 0 }, { 1, 0 }, { 1, 1 }, { 1, 2 } }, { { 1, 0 }, { 1, 1 }, { 1, 2 }, { 0, 2 } },
			{ { 0, 0 }, { 1, 0 }, { 1, 1 }, { 2, 1 } }, { { 0, 1 }, { 1, 1 }, { 1, 0 }, { 2, 0 } },
			{ { 0, 0 }, { 0, 1 }, { 1, 1 }, { 1, 2 } }, { { 1, 0 }, { 1, 1 }, { 0, 1 }, { 0, 2 } },
			{ { 0, 0 }, { 0, 1 }, { 0, 2 }, { 1, 1 } }, { { 1, 0 }, { 1, 1 }, { 1, 2 }, { 0, 1 } },
			{ { 0, 0 }, { 1, 0 }, { 2, 0 }, { 1, 1 } }, { { 1, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 } } };
	static int[][] map; // 지도 정보
	static int N, M, max;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		max = 0;
		N = Integer.parseInt(st.nextToken()); // 세로
		M = Integer.parseInt(st.nextToken()); // 가로
		map = new int[N][M]; // 종이에 쓰여 있는 수 정보를 담은 배열

		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < M; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}

		for (int r = 0; r < N; r++) {
			for (int c = 0; c < M; c++) {
				calculate(r, c); // (0,0)부터 (N-1,M-1)까지 테트로미노 값 계산
			}
		}
		System.out.println(max);
	}

	static void calculate(int r, int c) {
		for (int i = 0; i < 19; i++) {
			int sum = 0; // 테트로미노가 놓인 칸에 쓰여 있는 수들의 합
			boolean flag = true;
			for (int j = 0; j < 4; j++) {
				if (flag) {
					int newR = r + tetromino[i][j][0];
					int newC = c + tetromino[i][j][1];
					if (chk(newR, newC)) { // 테트로미노가 놓인 칸이 종이 범위인 경우 합 계산
						sum += map[newR][newC];
					} else {
						flag = false; // 테트로미노가 놓인 칸이 종이 범위를 초과하는 경우
					}
				}
			}
			if (flag) {
				max = Math.max(max, sum); // 테트로미노가 놓인 칸이 종이 범위를 안 넘은 경우 최댓값인지 확인
			}
		}
	}

	// 종이 범위를 넘는지 확인
	static boolean chk(int r, int c) {
		if (r >= N || r < 0 || c >= M || c < 0) {
			return false;
		}
		return true;
	}
}

'알고리즘 > 문제풀이' 카테고리의 다른 글

[Java] 백준 3190 : 뱀  (0) 2022.06.25
[Java] 백준 13460 : 구슬 탈출 2  (0) 2022.06.25
[Java] 백준 14502 : 연구소  (0) 2022.04.10
[Java] 백준 10814 : 나이순 정렬  (0) 2021.12.17
[Java] 백준 10773 : 제로  (0) 2021.12.16

댓글