Seren dev's blog
article thumbnail

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

 

4920번: 테트리스 게임

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 표의 크기 N이 주어지고, 4 ≤ N ≤ 100을 만족한다. 둘째 줄부터 표에 쓰여 있는 숫자가 주어진다. 숫자는 절댓

www.acmicpc.net

풀이

5가지 조각으로 배치할 수 있는 모든 도형의 경우의 수(총 13가지)를 배열로 지정하여 풀었다.

 

주의할 점

- n을 입력받을 때와 NxN 표를 입력받을 때 trim()을 해주어야 한다.

- 표에 쓰이는 숫자는 절댓값이 1,000,000을 넘지 않는 정수이다. 즉, 음수가 입력될 수 있으므로 초기 max값을 Integer.MIN_VALUE로 초기화한다.

코드

import java.io.*;
import java.util.*;

public class Main
{
	
	static int n;
	static int[][] map;
	
	static int[][][] blocks = {
			{{0,0}, {0,1}, {0,2}, {0,3}},
			{{0,0}, {1,0}, {2,0}, {3,0}},
			{{0,0}, {0,1}, {1,1}, {1,2}},
			{{0,0}, {1,0}, {1,-1}, {2,-1}},
			{{0,0}, {0,1}, {0,2}, {1,2}},
			{{0,0}, {1,0}, {2,0}, {2,-1}},
			{{0,0}, {1,0}, {1,1}, {1,2}},
			{{0,0}, {0,1}, {1,0}, {2,0}},
			{{0,0}, {0,1}, {0,2}, {1,1}},
			{{0,0}, {1,0}, {1,-1}, {2,0}},
			{{0,0}, {1,0}, {1,-1}, {1,1}},
			{{0,0}, {1,0}, {1,1}, {2,0}},
			{{0,0}, {1,0}, {0,1}, {1,1}}
	};
	
	public static void main(String args[]) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		int test_case = 1;
		
		while (true) {
			n = Integer.parseInt(br.readLine().trim()); // trim하지 않으면 NumberFormatException 발생
			
			if (n == 0) break;
			
			map = new int[n][n];
			
			for (int i = 0; i < n; i++) {
				StringTokenizer st = new StringTokenizer(br.readLine().trim()); // trim
				for (int j = 0; j < n; j++) {
					map[i][j] = Integer.parseInt(st.nextToken().trim()); // trim
				}
			}
			int maxSum = calMaxSum();
			
			sb.append(test_case++).append(". ").append(maxSum).append("\n");
		}
		
		System.out.println(sb);
	}
	
	static int calMaxSum() {
		int max = Integer.MIN_VALUE; // 입력값이 음수인 경우 고려
		
		for (int idx = 0; idx < blocks.length; idx++) {
			for (int i = 0; i < n; i++) {
				for (int j = 0; j < n; j++) {
					int sum = calSum(idx, i, j);
					max = Math.max(sum, max);
				}
			}
		}
		return max;
	}
	
	static int calSum(int idx, int r, int c) {
		int sum = 0;
		for (int i = 0; i < blocks[idx].length; i++) {
			int nr = r + blocks[idx][i][0];
			int nc = c + blocks[idx][i][1];
			
			if (nr < 0 || nr >= n || nc < 0 || nc >= n) {
				return Integer.MIN_VALUE;
			}
			
			sum += map[nr][nc];
		}
		
		return sum;
	}
}

 

참고

- https://jaejin89.tistory.com/93

- https://velog.io/@yeonju501/BOJ-4920-%ED%85%8C%ED%8A%B8%EB%A6%AC%EC%8A%A4-%EA%B2%8C%EC%9E%84

 

728x90
profile

Seren dev's blog

@Seren dev

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!