hyelie
hyelie
Hyeil Jeong
       
글쓰기    관리    수식입력
  • 전체보기 (495)
    • PS (283)
      • Algorithm (28)
      • PS Log (244)
      • Contest (6)
      • Tips (5)
    • Development (52)
      • Java (14)
      • Spring (23)
      • SQL (2)
      • Node.js (2)
      • Socket.io (3)
      • Study (4)
      • Utils (4)
    • DevOps (36)
      • Git (5)
      • Docker (4)
      • Kubernetes (2)
      • GCP (3)
      • Environment Set Up (8)
      • Tutorial (12)
      • Figma (2)
    • CS (74)
      • OOP (7)
      • OS (24)
      • DB (2)
      • Network (24)
      • Architecture (0)
      • Security (2)
      • Software Design (0)
      • Parallel Computing (15)
    • Project (15)
      • Project N2T (5)
      • Project ASG (0)
      • Project Meerkat (1)
      • Model Checking (7)
      • Ideas (2)
    • 내가 하고싶은 것! (34)
      • Plan (16)
      • Software Maestro (10)
      • 취준 (8)
hELLO · Designed By 정상우.
hyelie

hyelie

PS/PS Log

23.04.06. 풀었던 문제들

Leetcode 1254. Number of Closed Islands

 많이 보던 grid에서 섬이 몇 개 있는지 탐색하는 문제이지만 추가 조건으로 모든 땅이 물 안에 있어야 하는 조건이 추가된다.

 이 문제에서는 땅이 0, 물이 1로 표현되기에 모든 0으로 표현되는 연결된 영역이 모든 1 안에 있어야 한다. 이를 판별하는 법은 0으로 연결된 영역이 grid의 테두리가 아니면 된다. grid의 테두리가 아닌 0으로 영역된 섬들은 모두 1로 둘러싸여 있기 때문이다.

  • DFS로 grid[r][c]가 0인 connected island를 모두 찾는다. 찾으면서 해당 좌표를 islands에 push한다. ... 1
  • DFS가 종료되면 모든 islands에 대한 정보를 찾은 것이다. islands의 모든 좌표를 순회하며 테두리에 있는지 여부를 탐색한다. 테두리에 땅이 있는 경우 1로 둘러싸여있지 않다. ... 2
// Runtime 17 ms Beats 37.16%
// Memory 11.8 MB Beats 19.3%

int dr[4] = {1, 0, -1, 0};
int dc[4] = {0, 1, 0, -1};

typedef pair<int, int> pii;

class Solution {
public:
    int visited[101][101];
    int maxr, maxc;
    vector<vector<int>> grid;
    vector<vector<pii>> islands;
    int cnt = 0;
    void DFS(int r, int c){ // ... 1
        for(int i = 0; i<4; i++){
            int nr = r + dr[i], nc = c + dc[i];
            if(0 <= nr && nr < maxr && 0 <= nc && nc < maxc && visited[nr][nc] == false && grid[nr][nc] == 0){
                visited[nr][nc] = true;
                islands[cnt].push_back({nr, nc});
                DFS(nr, nc);
            }
        }
    }
    int closedIsland(vector<vector<int>>& grids) {
        grid = grids;
        maxr = grid.size(); maxc = grid[0].size();
        for(int i = 0; i<maxr; i++){
            for(int j = 0; j<maxc; j++){
                visited[i][j] = false;
            }
        }
        islands.resize(1);
        
        // ... 1
        for(int i = 0; i<maxr; i++){
            for(int j = 0; j<maxc; j++){
                if(visited[i][j] == false && grid[i][j] == 0){
                    visited[i][j] = true;
                    islands[cnt].push_back({i, j});
                    DFS(i, j);
                    cnt++;
                    islands.push_back({});            
                }
            }
        }

        // ... 2
        int answer = 0;
        for(vector<pii>& island : islands){
            bool isClosed = true;
            for(pii p : island){
                if(p.first == 0 || p.first == maxr-1 || p.second == 0 || p.second == maxc-1){
                    isClosed = false;
                }
            }
            if(isClosed) answer++;
        }
        return answer-1;
    }
};

 

시간복잡도

 DFS 1번에 O(V+E), E = 4V이므로, row size를 m, col size를 n으로 표기하면 O(nm)이다. 이후 전체 좌표를 한 번 더 순회하므로 O(nm).

 

공간복잡도

 DFS를 하며 stack size는 worse case O(nm), grid와 islands vector도 O(nm)만큼 사용한다. 따라서 O(nm)

 

 

 

 

 

저작자표시 (새창열림)

'PS > PS Log' 카테고리의 다른 글

23.04.08. 풀었던 문제들  (0) 2023.04.08
23.04.07. 풀었던 문제들  (0) 2023.04.07
23.04.05. 풀었던 문제들  (0) 2023.04.05
23.04.04. 풀었던 문제들  (0) 2023.04.04
23.04.03. 풀었던 문제들  (0) 2023.04.03
    hyelie
    hyelie

    티스토리툴바