[LeetCode] Island Perimeter

아르당·2026년 1월 17일

LeetCode

목록 보기
96/134
post-thumbnail

문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음

Problem

주어진 격자는 행과 열로 이루어져 있고, grid[i][j] = 1은 육지를, grid[i][j] = 0은 물을 나타낸다.

격자 셀은 가로/세로로 연결되어 있다(대각선 연결은 없음). 격자는 완전히 물로 둘러싸여 있고, 섬은 하나(하나 이상의 연결된 육지)이다.

섬에는 호수가 없다. 섬 내부의 물과 섬 주변의 물이 연결되어 있지 않다. 각 셀은 한 변의 길이가 1인 정사각형이다. 격자는 직사각형이며, 가로와 세로 길이는 100을 넘지 않는다. 섬의 둘레를 구해라.

Example

#1

Input: grid = [[0, 1, 0, 0], [1, 1, 1, 0], [0, 1, 0, 0], [1, 1, 0, 0]]
Output: 16
Explanation: 위 이미지에서 노란색 줄무늬 16개가 경계선이다.

#2
Input: grid = [[1]]
Output: 4

#3
Input: grid = [[1, 0]]
Output: 4

Constraints

  • row == grid.length
  • col == grid[i].length
  • 1 <= row, col <= 100
  • grid[i][j]는 0 또는 1이다.
  • 격자 안에는 섬이 정확히 하나 있다.

Solved

class Solution {
    public int islandPerimeter(int[][] grid) {
        int rows = grid.length;
        int cols = grid[0].length;
        int perimeter = 0;

        for(int r = 0; r < rows; r++){
            for(int c = 0; c < cols; c++){
                if(grid[r][c] == 1){
                    perimeter += dfs(grid, r, c);
                }
            }
        }

        return perimeter;
    }

    private int dfs(int[][] grid, int r, int c){
        if(r < 0 || r >= grid.length || c < 0 || c >= grid[0].length || grid[r][c] == 0){
            return 1;
        }
        if(grid[r][c] == -1){
            return 0;
        }

        grid[r][c] = -1;

        return (dfs(grid, r + 1, c) + dfs(grid, r - 1, c) + dfs(grid, r, c + 1) + dfs(grid, r, c - 1));
    }
}
profile
내 마음대로 코드 작성하는 세상

0개의 댓글