낭만개발자
낭만개발자
낭만개발자
전체 방문자
오늘
어제
  • 분류 전체보기 (57)
    • Web) HTML & CSS (5)
    • Web) HTTP (2)
    • 언어) Java (2)
    • 언어) Python (6)
    • 언어) PHP (1)
    • Linux (2)
    • 데이터 관리) Pandas (4)
    • Algorithms (13)
    • 개발자 역량 (4)
    • 프로젝트 (14)
      • Django 초기 프로젝트 (1)
      • CatCoDog _ 반려동물 식품 판매 사이트 (9)
      • 개인 홈서버 프로젝트 (2)
      • 이력핏 : AI가 추천해주는 이력서 (2)
    • 문제와 사고 (2)
    • ETC (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • algorithm
  • leetcode88
  • dp
  • python operator
  • css 위치변경
  • django setting
  • css basic
  • 파이썬 자료형
  • Merge Sorted Array
  • python basic
  • 파이썬 숫자형
  • python
  • Java
  • Number Of Island
  • css
  • 파이썬
  • 리눅스
  • 장고 초기 세팅
  • 파이썬 기초
  • WEB
  • JWT 웹
  • css 포지션
  • css 기본
  • 파이썬 기본
  • 오늘의 문제
  • Unique Paths
  • catcodog
  • Leetcode
  • 웹개발
  • rainbow table

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
낭만개발자

낭만개발자

Algorithms

[Algorithm] Leetcode 200. Number of Islands (java)

2024. 1. 28. 14:50

풀이 코드

 

class Solution {
    private static final int[][] DIRECTION = {
        {-1, 0}, {1, 0}, {0, -1}, {0, 1}
    };
    
    public int numIslands(char[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        int ans = 0;
        
        for (int y = 0; y < m; ++y){
            for (int x = 0; x < n; ++x){
                if(grid[y][x] == '1'){
                    deleteIsland(y, x, grid);
                    ans++;
                }
            }
        }
        return ans;
    }
    
    public void deleteIsland(int y, int x, char[][] grid){
        
        if(y < 0 || y >= grid.length || x < 0 || x >= grid[0].length) return;
        if(grid[y][x] == '1'){
            grid[y][x] = '0';
            for(int[] direction : DIRECTION){
                int neighborY = y + direction[0];
                int neighborX = x + direction[1];
                
                deleteIsland(neighborY, neighborX, grid);
            }
        } 
    }
}

 


사고 과정

https://leetcode.com/problems/number-of-islands/

 

LeetCode - The World's Leading Online Programming Learning Platform

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

 

주어진 m X n의 binary grid "grid"의 "1"은 땅을, "0"은 물을 나타낸다. 

1이 모여있으면 섬, 0이 모여있으면 바다가 되는데, 이 중 섬의 개수를 구하는 문제!!

 

요즘 개발하면서 발생하는 문제들에 대해 일상 속 발생하는 문제와 연관지어서 해결법을 찾는 연습을 하고 있다. 

(생각보다 유용하다! 해보시길 추천..)

 

그런 의미에서 문제에 들어가기 앞서,, 우리가 평소 무언가 수를 셀 때 어떤 식으로 세는가?

주머니 속의 구슬을 셀 때는 count한 구슬은 밖으로 빼는 식으로 count한 것과 그렇지 않은 것을 구분하지 않는가? 

여기서 시작된 풀이법.. 

 

이 문제에서 섬을 세기 위해서 굳이 다른 grid를 생성해서 옮겨줄 필요는 없이, 그냥 섬을 없애면 되지 않을까??

(섬을 없앤다는 표현은 너무 섬뜩하니까.. 태평양 쓰레기 섬을 없앤다고 생각해보자!!)

문제의 궁극적 목표는 개수를 세는 것이니까!!

 

구현 시작.

 

먼저 grid 탐색을 위한 방향키부터 만들어주자. 

 

   private static final int[][] DIRECTION = {
        {-1, 0}, {1, 0}, {0, -1}, {0, 1}
    }

 

 

각각의 grid를 돌면서 만약 해당 인덱스값이 '1'이라면(즉, 섬이라면) 이를 '0'으로 바꿔주고(즉, 쓰레기 섬을 깨끗한 바다로 만들어주자!) 숫자를 카운트해주는 방향으로 구현해보자!

 

 public int numIslands(char[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        int ans = 0;
        
        for (int y = 0; y < m; ++y){
            for (int x = 0; x < n; ++x){
                if(grid[y][x] == '1'){
                    deleteIsland(y, x, grid);
                
                    ans++;
                }
            }
        }
        return ans;
    }
    
    
    public void deleteIsland(int y, int x, char[][] grid){
    	// ~~~
        // 탐색 알고리즘으로 1을 0으로!!
        // ~~~
    }

 

이제 준비는 다 되었으니 searchIsland 메서드를 구현해주자!

 

public void deleteIsland(int y, int x, char[][] grid){
        
        if(y < 0 || y >= grid.length || x < 0 || x >= grid[0].length) return;
        if(grid[y][x] == '1'){
            grid[y][x] = '0';
            for(int[] direction : DIRECTION){
                int neighborY = y + direction[0];
                int neighborX = x + direction[1];
                
                deleteIsland(neighborY, neighborX, grid);
            }
        } 
}

 

 

탐색 범위를 넘어가는 경우에 대한 예외처리를 해주면서, 

해당 인덱스 값이 1이라면 0으로 바꿔주고 이를 재귀함수로 처리하자!!

 

이 과정들을 최종적인 코드는 다음과 같다. 

 

class Solution {
    private static final int[][] DIRECTION = {
        {-1, 0}, {1, 0}, {0, -1}, {0, 1}
    };
    
    public int numIslands(char[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        int ans = 0;
        
        for (int y = 0; y < m; ++y){
            for (int x = 0; x < n; ++x){
                if(grid[y][x] == '1'){
                    deleteIsland(y, x, grid);
                    ans++;
                }
            }
        }
        return ans;
    }
    
    public void deleteIsland(int y, int x, char[][] grid){
        
        if(y < 0 || y >= grid.length || x < 0 || x >= grid[0].length) return;
        if(grid[y][x] == '1'){
            grid[y][x] = '0';
            for(int[] direction : DIRECTION){
                int neighborY = y + direction[0];
                int neighborX = x + direction[1];
                
                deleteIsland(neighborY, neighborX, grid);
            }
        } 
    }
}

 

오알완!

 

저작자표시 (새창열림)

'Algorithms' 카테고리의 다른 글

[A100C day 8] LeetCode 55. Jump Game (java)  (0) 2024.01.30
[Algorithm] LeetCode 647. Palindromic Substrings (java)  (1) 2024.01.30
[Algorithm] Leetcode 1. Two Sum(java)  (0) 2024.01.26
[Algorithm] Leetcode 34. Find First and Last Position of Element in Sorted Array (java)  (0) 2024.01.25
[A100C_day 3] Leetcode 79. Word Search (java)  (0) 2024.01.24
    낭만개발자
    낭만개발자
    Learning By Doing!💪

    티스토리툴바