알고리즘

[백준] 16236번 (java 자바)

changha. 2022. 9. 20. 22:52
import java.util.*;

public class Main
{
    static final int INF = 987654321;
    static int N;
    static int Map[][] = new int[20][20];
    static int Dr[] = {-1, 1, 0, 0};
    static int Dc[] = {0, 0, -1, 1};
    
    static class Point {
        int r, c, d;
        Point (int r, int c, int d){
            this.r = r;
            this.c = c;
            this.d = d;
            
        }
    }
    
    
    static int solve(int r, int c) {
        int ret = 0; // 이동하는 시간 
        int size = 2, cnt = 2;// 상어 크기, 크기 0 되면 사이즈 업 
        Point minPt = new Point(r, c, 0);
        
        do { //BFS 로직 
            boolean visited[][] = new boolean[20][20];
            Queue<Point> myqueue = new LinkedList<Point>();
            visited[minPt.r][minPt.c] = true;
            myqueue.add(new Point(minPt.r, minPt.c, 0));
            minPt.d = INF;
            
            while(myqueue.peek() != null){
                Point curr = myqueue.poll();
                
                if (curr.d > minPt.d) break; // 더 이상 진행할 물고기 없다는 뜻 
                if (Map[curr.r][curr.c] > size) continue;
                if (Map[curr.r][curr.c] != 0 && Map[curr.r][curr.c] < size){
                    if(curr.d < minPt.d){
                        minPt = curr;
                    }else if (curr.d == minPt.d){
                        if(curr.r < minPt.r){
                            minPt = curr;
                        }else if (curr.r == minPt.r && curr.c < minPt.c){
                            minPt = curr;
                        }
                        continue;
                    }
                    
                } 
                
                for(int i = 0; i < 4; ++i){
                    int nr = curr.r + Dr[i], nc = curr.c + Dc[i];
                    if (nr < 0 || nr > N - 1 || nc < 0 || nc > N - 1) continue;
                    if (visited[nr][nc]) continue;
                    visited[nr][nc] = true;
                    myqueue.add(new Point(nr, nc, curr.d + 1));
                }
            }
            
            if(minPt.d != INF){
                ret += minPt.d;
                --cnt;
                if (cnt == 0){
                    ++size;
                    cnt = size;
                }
                Map[minPt.r][minPt.c] = 0;
            }
            
        } while(minPt.d != INF);
        
        return ret;
    }
    
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		N = sc.nextInt();
		int srow = 0, scol = 0; // shark 위치 
		for (int i = 0; i < N; ++i){
		    for (int j = 0; j < N; ++j){
		        Map[i][j] = sc.nextInt();
		        if (Map[i][j] == 9){
		            srow = i;
		            scol = j;
		            Map[i][j] = 0;
		        }
		    }
		}
		
		System.out.println(solve(srow, scol));
	}
}

 

bfs 문제이지만 심화된 버전이라고 볼 수 있다..

어려우니까 계속해서 추가로 볼 문제 

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

DFS 기본 알고리즘  (0) 2022.09.28
BFS 기본 알고리즘  (0) 2022.09.25
[백준] 14500번 (java 자바)  (0) 2022.08.24
[백준] 9019번 (python 파이썬)  (0) 2022.08.21
[백준] 16928번(python 파이썬)  (0) 2022.08.18