본문 바로가기

알고리즘/문제풀이

[SWEA] 1861. 정사각형 방

반응형
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Solution {
	
	static int N, len;
	static int[][] map, dir = {{1,0}, {0,1}, {-1,0}, {0,-1}};
	static boolean[][] visited;
	static Queue<Pair> queue;
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int T = sc.nextInt();
		
		for(int tc=1; tc<=T; tc++) {
			N = sc.nextInt();
			map = new int[N][N];
			int maxLen = Integer.MIN_VALUE;
			int minVar = Integer.MAX_VALUE;
			
			for(int i=0; i<N; i++) {
				for(int j=0; j<N; j++) {
					map[i][j] = sc.nextInt();
				}
			}
			
			for(int i=0; i<N; i++) {
				for(int j=0; j<N; j++) {
					len = 0;
					visited = new boolean[N][N];
					BFS(i, j);
					
					if(maxLen < len) {
						maxLen = len;
						minVar = map[i][j];
					}
					if(maxLen == len && minVar > map[i][j]) {
						minVar = map[i][j];
					}
				}
			}
			System.out.println("#" + tc + " " + minVar + " " + maxLen);
		}
	}
	
	public static void BFS(int x, int y) {
		queue = new LinkedList();
		visited[x][y] = true;
		
		queue.offer(new Pair(x, y));
		
		while(!queue.isEmpty()) {
			len++;
			int size = queue.size();
			
			for(int i=0; i<size; i++) {
				Pair p = queue.poll();
				
				for(int j=0; j<4; j++) {
					int nx = p.x + dir[j][0];
					int ny = p.y + dir[j][1];
					
					if(isInside(nx, ny) && !visited[nx][ny] && map[nx][ny] == map[p.x][p.y]+1) {
						queue.offer(new Pair(nx, ny));
						visited[nx][ny] = true;
					}
				}
			}
			
		}
		
	}
	
	public static boolean isInside(int x, int y) {
		return x>=0 && x<N && y>=0 && y<N;
	}
}

class Pair {
	int x;
	int y;

	Pair(int x, int y){
		this.x=x;
		this.y=y;
	}
}
반응형

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

[백준] 17070. 파이프 옮기기1  (0) 2020.02.19
[SWEA] 1873. 상호의 배틀필드  (4) 2020.02.10
[백준] 4179. 불!  (0) 2020.02.05
[백준] 17136. 색종이 붙이기  (2) 2020.02.05
[정올] 1169. 주사위 던지기1  (0) 2020.02.01