티스토리 뷰

알고리즘

[백준] 14500. 테트로미노 (Java)

melthleeth 2020. 12. 27. 16:57

블록 모양별 case를 나눠 brute force

 

 

14500번: 테트로미노

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

www.acmicpc.net

 

풀이

범위 실수만 안하면 무난하게 풀 수 있는 문제이다.

반복되는 부분을 줄이고 싶어서 아래처럼 공통되는 부분을 찾고 method화 하였다.

 

 

그리고 블록이 범위를 벗어나는 부분을 간편하게 처리하기 위해 이차원 배열 크기를 처음부터 넉넉히 설정하였다.

 

계속 틀렸습니다가 뜬다면 아래의 반례를 참고하도록 하자.

 

 

 

글 읽기 - 왜87%에서 틀렸습니다가뜰까요 ㅠ 도와줘요 코딩짱짱맨~~

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

 

Logic

  1. 2중 for문을 돌면서 해당 범위 내의 최댓값을 찾는다.
  2. 답을 출력한다.

 

코드

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

public class Main {
	static int N, M, ans;
	static int[][] map;

	public static void main(String[] args) throws IOException {
		input();
		solve();
		System.out.println(ans);
	}
	
	public static void input() 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 + 4][M + 4];

		for (int i = 1; i <= N; i++) {
			st = new StringTokenizer(br.readLine());
			
			for (int j = 1; j <= M; j++) 
				map[i][j] = Integer.parseInt(st.nextToken());
		}
		br.close();
	}
	
	public static void solve() {
		for (int i = 1; i <= N - 1; i++) {
			for (int j = 1; j <= M; j++) { 
				int temp = Math.max(R3C1(i, j), R2C1(i, j));
				ans = Math.max(ans, temp);
			}
		}
		for (int i = 1; i <= N; i++) {
			for (int j = 1; j <= M - 1; j++) {
				int temp = Math.max(R1C3(i, j), R1C2(i, j));
				ans = Math.max(ans, temp);
			}
		}
	}
	
	public static int R3C1(int x, int y) {
		int base = map[x][y] + map[x + 1][y] + map[x + 2][y];
		int maxValue = 0;
		
		for (int i = 0; i < 3; i++) {
			maxValue = Math.max(maxValue, base + map[x + i][y - 1]);
			maxValue = Math.max(maxValue, base + map[x + i][y + 1]);
		}
			maxValue = Math.max(maxValue, base + map[x + 3][y]);
		
		return maxValue;
	}
	
	public static int R2C1(int x, int y) {
		int base = map[x][y] + map[x + 1][y];
		int maxValue = 0;
		
		int[] val = { map[x][y + 1] + map[x + 1][y + 1], 
				map[x + 1][y + 1] + map[x + 2][y + 1], 
				map[x + 2][y] + map[x + 3][y], 
				map[x + 1][y - 1] + map[x + 2][y - 1] };
		
		for (int i = 0; i < val.length; i++)
			maxValue = Math.max(maxValue, base + val[i]);
		return maxValue;
	}
	
	public static int R1C3(int x, int y) {
		int base = map[x][y] + map[x][y + 1] + map[x][y + 2];
		int maxValue = 0;
		
		for (int j = 0; j < 3; j++) {
			maxValue = Math.max(maxValue, base + map[x - 1][y + j]);
			maxValue = Math.max(maxValue, base + map[x + 1][y + j]);
		}
		maxValue = Math.max(maxValue, base + map[x][y + 3]);
		
		return maxValue;
	}
	
	public static int R1C2(int x, int y) {
		int base = map[x][y] + map[x][y + 1];
		int maxValue = 0;
		
		int[] val = { map[x + 1][y - 1] + map[x + 1][y], map[x + 1][y + 1] + map[x + 1][y + 2] };
		
		for (int i = 0; i < val.length; i++)
			maxValue = Math.max(maxValue, base + val[i]);
		
		return maxValue;
	}

}

 

실행 결과

 

'알고리즘' 카테고리의 다른 글

[백준] 16234. 인구이동 (Java)  (0) 2021.01.13
[백준] 17413. 단어 뒤집기2 (Java)  (0) 2021.01.03
[백준] 2290. LCDTest (Java)  (1) 2020.12.23
[백준] 2933. 미네랄  (0) 2020.12.20
[백준] 15662. 톱니바퀴2 (Java)  (0) 2020.12.20
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함