As Far from Land as Possible

유승선 ·2024년 1월 26일
0

LeetCode

목록 보기
96/115

바로 전에 풀었던 문제와 상당히 비슷한 결이다. 이번에는 0이 물이고 1이 지상일때 가장 지상이랑 멀리 위치한 물을 찾으면 된다.

Shortest Path 문제는 보통 BFS 류가 많이 사용되는데..이 문제와 전에 문제에 특징은 한 포인트에서 찾는게 아니고 여러 포인트에서 가장 짧은 루트를 찾아야 한다.

만약 0에서부터 탐색을 시작하면은 탐색 범위가 0을 또 포함 해야하기 때문에 중복이 되고 더 커진다. 그렇기 때문에 1에서 시작해서 반대로 탐색하는게 훨씬 더 효율적이다.

전 문제와 비슷하게 풀었고 빠르게 풀었다.

class Solution {

struct Node{
    int x, y, dist; 
};
vector<pair<int,int>> dir = {{0,1},{0,-1},{1,0},{-1,0}}; 
public:
    int maxDistance(vector<vector<int>>& grid) {
        int answer = -1; 
        queue<Node> q; 
        vector<vector<bool>> visited(grid.size(), vector<bool>(grid[0].size(), false)); 
        for(int i = 0; i < grid.size(); i++){
            for(int j = 0; j < grid[i].size(); j++){
                if(grid[i][j] == 1){
                    q.push({i,j,0}); 
                    visited[i][j] = true; 
                }
            }
        }

        while(!q.empty()){
            int size = q.size();
            for(int i = 0; i < size; i++){
                Node node = q.front();
                q.pop(); 
                int x = node.x, y = node.y, dist = node.dist; 
                for(pair<int,int>& p : dir){
                    int nX = x + p.first; 
                    int nY = y + p.second; 

                    if(nX < 0 || nY < 0 || nX >= grid.size() || nY >= grid[0].size() || visited[nX][nY]) continue; 

                    visited[nX][nY] = true;
                    q.push({nX,nY,dist+1}); 
                    answer = max(answer, dist+1); 
                }
            }
        }

        return answer; 
        
    }
};
profile
성장하는 사람

0개의 댓글