본문 바로가기
코딩 테스트

7576번 토마토 문제(자바, java) - 백준 문제풀이

by 주용사 2023. 1. 9.
728x90
import java.io.*;
import java.util.*;

public class Main {
	static int count = 0;
	   public static void main(String[] args) throws IOException {

	      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	      // StringBuilder sb = new StringBuilder();
	      StringTokenizer st = new StringTokenizer(br.readLine());

	      int y = Integer.parseInt(st.nextToken());
	      int x = Integer.parseInt(st.nextToken());

	      int[][] map = new int[x][y];
	      boolean[][] visited = new boolean[x][y];
	      
	      String[] one = new String[x * y];
	      int count = 0;
	      for(int ii = 0 ; ii < x ; ii++)
	      {
	         st = new StringTokenizer(br.readLine());
	         for(int jj = 0 ;jj < y ; jj++)
	         {
	            map[ii][jj] = Integer.parseInt(st.nextToken());
	            if(map[ii][jj] == 1)
	               one[count++] = ii + "," + jj;
	               
	         }
	      }
	      
	      Queue<String> q = new LinkedList<>();
			
			
	      for(int ii = 0 ; ii < count ; ii++)
	    	 q.add(one[ii]);
	        
	      bfs(q, map, visited, x, y);
	      /* 이 주석을 풀면 bfs가 퍼져나가는 모습을 볼 수 있다.
	      for(int ii = 0 ; ii < x ; ii++)
	      {
	         for(int jj = 0 ;jj < y ; jj++)
	            System.out.print(map[ii][jj] + " ");
	         System.out.println();
	      }
	      */
	      int max = 0;
	      for(int ii = 0 ; ii < x ; ii++)
	      {
	         for(int jj = 0 ;jj < y ; jj++)
	         {
	        	 if(max <map[ii][jj])
	        		 max = map[ii][jj];
	        	 else if(map[ii][jj] == 0)
	        	 {
	        		 max = 0;
	        		 break;
	        	 }
	         }
	         if(max == 0)
	        	 break;
	      }
	      
	      System.out.println(max - 1);
	      
	      br.close();
	   }
	   
	   
	static public void bfs(Queue<String> q, int[][] map, boolean[][] visited, int X, int Y) {
		while (!q.isEmpty()) {
			int x = 0;
			int y = 0;

			String s = q.poll();
			String[] a = s.split(",");
			x = Integer.parseInt(a[0]);
			y = Integer.parseInt(a[1]);

			visited[x][y] = true;
			
			if (up(map, visited, X, Y, x, y) == true) {
				map[x - 1][y] = map[x][y] + 1;
				String stemp = (x - 1) + "," + y;
				q.add(stemp);
			}

			if (right(map, visited, X, Y, x, y) == true) {
				map[x][y + 1] = map[x][y] + 1;
				String stemp = x + "," + (y + 1);
				q.add(stemp);
			}

			if (down(map, visited, X, Y, x, y) == true) {
				map[x + 1][y] = map[x][y] + 1;
				String stemp = (x + 1) + "," + y;
				q.add(stemp);
			}

			if (left(map, visited, X, Y, x, y) == true) {
				map[x][y - 1] = map[x][y] + 1;
				String stemp = x + "," + (y - 1);
				q.add(stemp);
			}
		}

		
	}

	   public static boolean up(int[][] map, boolean[][] visited, int X, int Y, int x, int y)
	   {
	      if(x-1 >= 0 && map[x -1][y] == 0 && visited[x-1][y] == false)
	         return true;
	      else 
	         return false;
	   }
	   
	   public static boolean right(int[][] map, boolean[][] visited, int X, int Y, int x, int y)
	   {
	      if(y+1 < Y && map[x][y+1] == 0 && visited[x][y+1] == false)
	         return true;
	      else 
	         return false;
	   }
	   
	   public static boolean down(int[][] map, boolean[][] visited, int X, int Y, int x, int y)
	   {
	      if(x+1 < X && map[x+1][y] == 0 && visited[x+1][y] == false)
	         return true;
	      else 
	         return false;
	   }

	   public static boolean left(int[][] map, boolean[][] visited, int X, int Y, int x, int y)
	   {
	      if(y-1 >= 0 && map[x][y-1] == 0 && visited[x][y-1] == false)
	         return true;
	      else 
	         return false;
	   }
	}
728x90