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

[백준 JAVA] 14500 테트로미노

by 새싹감자 2022. 9. 16.

문제


14500번: 테트로미노 (acmicpc.net)

 

14500번: 테트로미노

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

www.acmicpc.net

 

 

풀이방법


처음에는 모든 모양을 다 고려해서 풀어야하는 줄 알았는데 시간 제한을 보니 그렇게 풀 수 없는 문제였다.

 

다음에 생각해낸 방법은 dfs를 사용하는 것이다.

dfs를 사용하면 ㅗ,ㅜ,ㅓ,ㅏ를 제외한 모든 모양을 만들어낼 수 있고, 그 중에서 최대값을 찾으면 된다.

4방탐색을 진행하며 sum에 map값을 더해준 값을 매개변수로 계속 전달하고, 그중에서 최대값을 찾는다.

 

그 외의 ㅗ,ㅜ,ㅓ,ㅏ는 각각의 범위를 확인하고, getcount함수를 사용해서 하나 하나 세어줬다.

코드는 아래와 같다.

코드


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

public class Main{
	
	static int[][] del = {{-1,0},{1,0},{0,-1},{0,1}};
	static int map[][];
	static int N,M;
	static boolean visit[][];
	static int num;
	static int max=Integer.MIN_VALUE;
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		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];
		visit= new boolean[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++) {
				visit[i][j]=true;
				dfs(i,j,1,map[i][j]);
				visit[i][j]=false;
				getcount(i,j);
			}
		}

		System.out.println(max);
		
	}
	

	static void dfs(int x, int y,int cnt,int sum) {
		if(cnt==4) {
			max=Math.max(max, sum);
			return;
		}
		for(int i=0; i<4; i++) { //4방 탐색을 진행하면서
			int nx=x + del[i][0];
			int ny=y + del[i][1];
			
			if(nx>=0 && nx<N && ny>=0 && ny<M && visit[nx][ny]==false) {
				visit[nx][ny]=true;
				dfs(nx,ny,cnt+1,sum+map[nx][ny]);
				visit[nx][ny]=false;
			}
			
			
		}

	}
	
	static void getcount(int x, int y) {
		//ㅜ
		int getsum1=0;
		if(y-1>=0 && y+1<M && x+1<N ) {
			getsum1=map[x][y-1]+map[x][y+1]+map[x][y]+map[x+1][y];
		}
		max=Math.max(getsum1, max);
		//ㅗ
		int getsum2=0;
		if(y-1>=0 && y+1<M && x-1>=0 ) {
			getsum2=map[x][y-1]+map[x][y+1]+map[x][y]+map[x-1][y];
		}
		max=Math.max(getsum2, max);
		//ㅓ
		int getsum3=0;
		if(y-1>=0 && x+1<N && x-1>=0) {
			getsum3=map[x][y-1]+map[x+1][y]+map[x][y]+map[x-1][y];
		}
		max=Math.max(getsum3, max);
		//ㅏ
		int getsum4=0;
		if(x-1>=0 && y+1<M && x+1<N ) {
			getsum4=map[x][y+1]+map[x+1][y]+map[x][y]+map[x-1][y];
		}
		max=Math.max(getsum4, max);
	}

}

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

[백준 JAVA] 10826 피보나치 수4  (0) 2022.09.18
[백준 JAVA] 17406 배열 돌리기 4  (0) 2022.09.18
[백준 JAVA]2636 치즈  (0) 2022.09.15
[백준 JAVA]13023 ABCDE  (0) 2022.09.12
[백준 JAVA & Python] 1260 DFS와 BFS  (0) 2022.09.12

댓글