Dev/백준

백준 7576번 java 풀이 - bfs

Aloner 2022. 12. 29. 16:46
728x90
반응형

반응형

풀이

이 문제는 여러 토마토가 동시에 익어가기 때문에 bfs 알고리즘을 통해 풀어야 합니다.

큐 자료구조에 토마토의 좌표값을 넣었기 때문에 Point 라이브러리를 사용하여 좌표값을 넣었습니다.

http://cris.joongbu.ac.kr/course/java/api/java/awt/Point.html

 

Point (Java 2 Platform SE 5.0)

 void translate (int dx, int dy)           (x,  y)의 위치에 있는 이 점을 x 축으로 따라 dx, y 축으로 따라 dy로 이동해, 점 (x + dx, y + dy)을 나타내도록 합니다.

cris.joongbu.ac.kr

array배열엔 해당 인덱스까지 소요된 시간을 저장하고 visit 배열엔 해당 인덱스를 방문했는지 유무를 boolean으로 저장했습니다.

bfs 알고리즘을 다 수행한 뒤 array배열에 저장된 최대 소요시간을 출력해야 하기 때문에 이중 반복문으로 max값을 찾았고 익지 않은 토마토(배열값 0)가 발견되면 이중 반복문을 나오기 위해 Loop: 를 사용했습니다.

https://ifuwanna.tistory.com/269

 

[Java] 중첩 반복문 break ( 이중 for문 break )

Java에서 반복문 실행 중 특정 조건을 만족했을때 아래와 같이 break 명령어를 사용하여 현재 위치의 반복문을 빠져나올 수 있습니다. for(int i=0; i

ifuwanna.tistory.com

import java.util.*;
import java.io.*;
import java.awt.Point;

class Main{
	static int[][] array;
	static boolean[][] visit;
	static int row = 0;
	static int col = 0;
	static Queue<Point> queue = new LinkedList<Point>();
	public static void main(String[] args) throws java.lang.Exception{
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		col = Integer.parseInt(st.nextToken());
		row = Integer.parseInt(st.nextToken());
		array = new int[row][col];
		visit = new boolean[row][col];
		
		for(int i=0; i<row; i++){
			st = new StringTokenizer(br.readLine());
			int j=0;
			while(st.hasMoreTokens()){
				array[i][j] = Integer.parseInt(st.nextToken());
				if(array[i][j] == 1){
					queue.add(new Point(j,i));
					visit[i][j] = true;
				}
				j++;
			}
		}
		
        if(!queue.isEmpty()){
		    Point p = queue.poll();
		    bfs(p.x,p.y);
        }
		
		int max = 0;
		Loop1:
		for(int i=0; i<row; i++){
			for(int j=0; j<col; j++){
				if(array[i][j] > max)
					max = array[i][j];
				else if(array[i][j] == 0){
					max = 0;
					break Loop1;
				}
			}
		}
		System.out.println(max - 1);
	}
	
	public static void bfs(int x, int y){
		if(x > 0 && array[y][x-1] != -1 && visit[y][x-1] == false){//왼쪽 검사
			queue.add(new Point(x-1,y));
			visit[y][x-1] = true;
			array[y][x-1] = array[y][x] + 1;
		}
		if(x+1 < col && array[y][x+1] != -1 && visit[y][x+1] == false){//오른쪽 검사
			queue.add(new Point(x+1,y));
			visit[y][x+1] = true;
			array[y][x+1] = array[y][x] + 1;
		}
		if(y > 0 && array[y-1][x] != -1 && visit[y-1][x] == false){//위 검사
			queue.add(new Point(x,y-1));
			visit[y-1][x] = true;
			array[y-1][x] = array[y][x] + 1;
		}
		if(y+1 < row && array[y+1][x] != -1 && visit[y+1][x] == false){//위 검사
			queue.add(new Point(x,y+1));
			visit[y+1][x] = true;
			array[y+1][x] = array[y][x] + 1;
		}
		
		if(!queue.isEmpty()){
			Point p = queue.poll();
			bfs(p.x,p.y);
		}
	}
}
728x90
반응형