본문 바로가기

ProgramSoliving

백준 : 4920

반응형

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

 

4920번: 테트리스 게임

문제 테트리스는 아래와 같은 5가지 조각으로 이루어져 있다. 정수로 이루어진 N×N 표가 주어진다. 테트리스 블록 중 하나를 표에 놓아 블록 아래에 있는 숫자의 합의 최댓값을 구하는 프로그램�

www.acmicpc.net

 

rotate와 배열돌리기를 적절히 활용해서 문제를 풀었다.

 

주의 할점은 100만 이하의 절대값인 수가 입력으로 들어온다. 따라서 long값과 sovle의 범위초과할때 Long.MINVALUE를 해주면 쉽게 구현할 수 있다.

 

package ps;

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

public class B4920 {
	static long Map[][] = new long[100][100];
	static int N;
	static long ans;

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

		boolean block[][][] = { 
				{ { true, true, true, true } }, 
				{ { true, true, false }, { false, true, true } },
				{ { true, true, true }, { false, false, true } }, 
				{ { true, true, true }, { false, true, false } },
				{ { true, true }, { true, true } } };
		int t=0;
		while (0 != (N = Integer.parseInt(br.readLine().trim()))) {

			for (int i = 0; i < N; i++) {
				st = new StringTokenizer(br.readLine().trim());
				for (int j = 0; j < N; j++) {
					Map[i][j] = Long.parseLong(st.nextToken().trim());
				}
			}
			
			// 조사를 해보자
			ans = Long.MIN_VALUE;
			for (int i = 0; i < N; i++) {
				for (int j = 0; j < N; j++) {
					for (int k = 0; k < 5; k++) {
						for (int d = 0; d < 4; d++) {
							ans = Math.max(ans, Solve(i,j,block[k]));
							//rotate
							block[k] = Rotate(block[k]);
							
						}
					}
				}
			}
			sb.append(++t).append('.').append(' ');
			sb.append(ans).append('\n');
		}
		System.out.println(sb.toString());
	}

	public static boolean[][] Rotate(boolean[][] block) {
		int r = block.length;
		int c = block[0].length;
		boolean copy[][] = new boolean[c][r];

		for (int i = 0; i < c; i++) {
			for (int j = 0; j < r; j++) {
				copy[i][j] = block[r-1-j][i];
			}
		}

		return copy;
	}

	public static long Solve(int y, int x, boolean[][] block) {
		int r = block.length;
		int c = block[0].length;

		if (y + r > N)
			return Long.MIN_VALUE;
		if (x + c > N)
			return Long.MIN_VALUE;
		
		long cnt = 0;

		for (int i = y, rr = 0; i < y + r && rr < r; i++, rr++) {
			for (int j = x, cc = 0; j < x + c && cc < c; j++, cc++) {
				if (block[rr][cc]) {
					cnt += Map[i][j];
				}
			}
		}
		
		return cnt;
	}
}
반응형

'ProgramSoliving' 카테고리의 다른 글

백준 : 11585 속터지는 저녁 메뉴  (0) 2020.07.13
백준 : 1305 (광고) java  (0) 2020.07.13
백준 : 18809  (0) 2020.05.30
백준 : 18808 스티커 붙이기  (0) 2020.05.30
백준 : 4889 안정적인 문자열  (0) 2020.05.30