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

[JAVA]백준_14500_테트로미노

by 박 현 황 2021. 3. 14.

문제링크

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

 

14500번: 테트로미노

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

www.acmicpc.net

 

 

 

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

public class Main {

	static int N, M;
	static int map[][];
	static int res;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		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 i=0;i<N;i++) {
			for(int j=0;j<M;j++) {
				tetromino1(i, j);
				tetromino2(i, j);
				tetromino3(i, j);
				tetromino4(i, j);
				tetromino5(i, j);
			}
		}

		System.out.println(res);
	}

	static void tetromino1(int row, int col) {
		//0 0 0 0
		//2가지 경우
		int sum = 0;
		if((col+3)<M) {
			sum  = map[row][col]+map[row][col+1]+map[row][col+2]+map[row][col+3];
			res = Math.max(res, sum);
		}
		
		if((row+3)<N) {
			sum = map[row][col]+map[row+1][col]+map[row+2][col]+map[row+3][col];
			res = Math.max(res, sum);
		}
	}

	static void tetromino2(int row, int col) {
		int sum =0;
		if(row+1<N && col+1<M) {
			sum += map[row][col];
			sum +=map[row+1][col];
			sum +=map[row][col+1];
			sum +=map[row+1][col+1];
			res = Math.max(res, sum);
		}
		
		
	}

	static void tetromino3(int row, int col) {
		int sum = 0;
		if((row+2)<N && (col+1)<M) {
			sum = map[row][col] + map[row+1][col] + map[row+2][col] + map[row+2][col+1];
			res = Math.max(res, sum);
		}
		
		if((row+1)<N && (col+2)<M) {
			sum = map[row][col]+map[row][col+1]+map[row][col+2]+map[row+1][col];
			res = Math.max(res, sum);
		}
		
		if((row+2)<N && (col+1)<M) {
			sum = map[row][col]+map[row][col+1]+map[row+1][col+1]+map[row+2][col+1];
			res = Math.max(res, sum);
		}
		
		if((row+1)<N && (col-2)>=0) {
			sum = map[row][col]+map[row+1][col]+map[row+1][col-1]+map[row+1][col-2];
			res = Math.max(res, sum);
		}
		
		if((row+2)<N && (col-1)>=0) {
			sum =map[row][col]+map[row+1][col]+map[row+2][col]+map[row+2][col-1];
			res = Math.max(res, sum);
		}
		
		if((row-1)>=0 && (col+2)<M) {
			sum = map[row][col]+map[row][col+1]+map[row][col+2]+map[row-1][col];
			res = Math.max(res, sum);
		}
		
		if((row+2)<N && (col+1)<M) {
			sum = map[row][col]+map[row+1][col]+map[row+2][col]+map[row][col+1];
			res = Math.max(res, sum);
		}
		if((row+1)<N && (col+2)<M) {
			sum = map[row][col]+map[row][col+1]+map[row][col+2]+map[row+1][col+2];
			res = Math.max(res, sum);
		}
	}

	static void tetromino4(int row, int col) {

		int sum = 0;
		if((row+2)<N && (col+1)<M) {
			sum = map[row][col]+map[row+1][col]+map[row+1][col+1]+map[row+2][col+1];
			res = Math.max(res, sum);
		}
		
		if((row-1)>=0 && (col+2)<M) {
			sum = map[row][col]+map[row][col+1]+map[row-1][col+1]+map[row-1][col+2];
			res = Math.max(res, sum);
		}
		
		if((row+2)<N && (col-1)>=0) {
			sum = map[row][col]+map[row+1][col]+map[row+1][col-1]+map[row+2][col-1];
			res = Math.max(res, sum);
		}
		
		if((row+1)<N && (col+2)<M) {
			sum = map[row][col]+map[row][col+1]+map[row+1][col+1]+map[row+1][col+2];
			res = Math.max(res, sum);
		}
	}

	static void tetromino5(int row, int col) {
		int sum = 0;
		if((row+1)<N && (col+2)<M) {
			sum = map[row][col]+map[row][col+1]+map[row][col+2]+map[row+1][col+1];
			res = Math.max(res, sum);
		}
		
		if((row+2)<N && (col-1)>=0) {
			sum = map[row][col]+map[row+1][col]+map[row+2][col]+map[row+1][col-1];
			res = Math.max(res, sum);
		}
		
		if((row-1)>=0 && (col+2)<M) {
			sum = map[row][col]+map[row][col+1]+map[row][col+2]+map[row-1][col+1];
			res = Math.max(res, sum);
		}
		
		if((row+2)<N && (col+1)<M) {
			sum = map[row][col]+map[row+1][col]+map[row+2][col]+map[row+1][col+1];
			res = Math.max(res, sum);
		}
	}
}

 

 

테스트케이스? 하나하나 다 돌려보면 됩니다.

중간에  런타임 에러나서 코드 중에 틀린 곳 있는지 찾다가 눈 빠지는 줄 알았다

 

 

위의 5가지의 경우의 수가 있다.

윗 줄부터 오른쪽으로 tetromino1->5까지 함수를 만들었습니다.

 

1번의 경우의 수는

       
 
 
 
 

 

2가지가 존재합니다.

 

2번의 경우의 수는

   
   

한 가지가 존재합니다.

 

3번의 경우의 수는

 

4번의 경우의 수는

 

5번의 경우의 수는

이렇게 존재합니다.

 

제 코드도 그림 순서대로 적혀있습니다.

 

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

[JAVA]백준_7569_토마토  (0) 2021.03.15
[JAVA]백준_7576_토마토  (0) 2021.03.15
[JAVA]백준_2661_좋은순열  (0) 2021.03.07
[JAVA]백준_2667_단지번호붙이기  (0) 2021.03.06
[JAVA]백준_2023_신기한 소수  (0) 2021.03.05