[알고리즘] 4 - 섬의 수

15425 단어 algorithms
Link to the problem

1. 개요


  • 이 문제에 사용된 접근 방식은 BFS(Breadth First Search)입니다. 한 지점에서 시작하여 주어진 2D 배열의 위, 아래, 왼쪽 및 오른쪽 좌표를 스캔합니다.

  • 2. 투쟁


  • 이 글을 쓰게 된 이유는 BFS를 이용한 솔루션에 있어서 작은 실수가 비효율적인 솔루션으로 이어질 수 있음을 알게 되었기 때문입니다. 그리고 어떤 면접에서도 같은 실수를 하지 않기 위해 이 사실을 공유하고 싶었습니다.
  • 내 실수가 있는 코드는 정답을 제공하지만 Leetcode에서는 "시간 제한 초과"오류가 발생합니다.

  • 3. 코드



    주요 기능

    int numIslands(vector<vector<char>>& grid) {
    
            if(grid.size() == 0) return 0;
    
            int count = 0;
            for (int i = 0; i < grid.size(); i++){
                for (int j = 0; j < grid[0].size(); j++){
                    if(grid[i][j] == '0') {
                        continue;
                    } else {
                        BFS(grid, i, j, count);
                    }
                }
            }
            return count;
        }
    


    잘못된 BFS 기능

    void BFS(vector<vector<char>>& grid, int i, int j, int& count){
            vector<vector<int>> dir = {{-1,0}, {1,0}, {0,-1}, {0,1}};
            queue<vector<int>> q;
            vector<int> start = {i, j};
            q.push(start);
            while(!q.empty()){
                vector<int> curr = q.front();
                grid[curr[0]][curr[1]] = '0'; 
                q.pop();
                for (auto v:dir){
                    int newCol = curr[0] + v[0];
                    int newRow = curr[1] + v[1];
                    if (newCol < 0 || newRow < 0 || newCol >= grid.size() || newRow >= grid[0].size() || grid[newCol][newRow] == '0'){
                        continue;
                    } else {
                        vector<int> nextPos = {newCol, newRow};
                        q.push(nextPos);
                    }
                }
            }
            count++;
        }
    


    올바른 BFS 기능

    static void BFS(vector<vector<char>>& grid, int i, int j, int& count){
            vector<vector<int>> dir = {{-1,0}, {1,0}, {0,-1}, {0,1}};
            queue<vector<int>> q;
            vector<int> start = {i, j};
            q.push(start); 
            while(!q.empty()){
                vector<int> curr = q.front();
                q.pop();
                grid[curr[0]][curr[1]] = '0'; 
                for (auto v:dir){
                    int newCol = curr[0] + v[0];
                    int newRow = curr[1] + v[1];
                    if (newCol < 0 || newRow < 0 || newCol >= grid.size() || newRow >= grid[0].size() || grid[newCol][newRow] == '0'){
                        continue;
                    } else {
                        vector<int> nextPos = {newCol, newRow};
                        grid[curr[0]][curr[1]] = '0'; // <= Solution                  
                        q.push(nextPos);
                    }
                }
            }
            count++;
        }
    


    4. 설명



    첫 번째 함수가 오류를 일으키는 이유를 보셨습니까? 그 이유는 내가 BFS를 활용하지 않았기 때문입니다. 위, 아래, 왼쪽, 오른쪽 좌표를 스캔하는 동안 '1'을 '0'으로 바꾸지 않았기 때문에 다음 루프에서 큐는 내가 이미 방문한 좌표를 계속 푸시할 것입니다. 답변이 동일하더라도 시간 제한 초과 오류입니다.

    좋은 웹페이지 즐겨찾기