Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Docker
- 머신러닝
- 컨설팅
- BFS
- SpringBoot
- vuejs
- LLaMa
- 컨설턴트
- OpenShift
- 쿠버네티스
- k8s
- 오픈시프트
- 생성형 AI
- Machine Learning
- 메세지큐
- GPT
- 도커
- POD
- 리트코드
- Python
- 생성형
- vue.js
- fast api
- jpa
- 솔루션조사
- LeetCode
- kubernetes
- fastapi
- 로깅
- Redis
Archives
- Today
- Total
수 많은 우문은 현답을 만든다
인접하지 않은 섬 개수 구하기 본문
주어진 m x n 크기의 2D 이진 그리드 grid는 '1'로 표시된 육지와 '0'으로 표시된 물의 지도를 나타냅니다. 섬의 수를 반환하는 함수를 작성하세요. 섬은 물로 둘러싸여 있으며 수평 또는 수직으로 인접한 육지를 연결하여 형성됩니다. 그리드의 네 가장자리는 모두 물로 둘러싸여 있다고 가정할 수 있습니다.
Example:
Input: grid = [
["1","1","0","0","0"],
["1","1","0","0","0"],
["0","0","1","0","0"],
["0","0","0","1","1"]
]
Output: 3
아주 신나고 흥미 진진한 문제네요~ 생각보다 쉽게 풀릴 것 같은데요 한 번 풀어보겠습니다.
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
count = 0
col = len(grid[0])
row = len(grid)
visited = [[0 in _for range(col)]] in _ for range(row)]
def bfs(start)
return 1
for i in range(row):
for j in range(col):
count += bfs
return count
기본 틀은 위와같다.
- visited는 이차배열로 컴프리헨션 기법을 사용해서 0으로 초기화 하도록 하자
- BFS의 한 사이클이 완료되면 섬 1개를 반환해야한다.
- BFS는 모든 점에서 테스트 해야하는데 여기서 반복 횟수를 줄여 성능 향상을 시킬 수 있을 것 같다.
from collections import deque
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
count = 0
col = len(grid[0])
row = len(grid)
visited = [[0 in _for range(col)]] in _ for range(row)]
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
def bfs(x, y):
visited[x][y] = 1
q = deque([[x, y]])
while q:
cur_x, cur_b = q.popleft()
#이동 전략
return 1
for i in range(row):
for j in range(col):
if visited[j][i] == 0 and grid[i][j] == "1":
count += bfs(j, i)
return count
조금 진행된 코드이다.
- 진행 방향은 상, 하, 좌, 우가 될 것이므로 dx, dy 를 선언해준다.
- bfs의 기본 구성을 하고 x, y 형태로 이동을 해야하므로 [x, y] 처럼 배열 형태로 묶어주자
- bfs를 호출할때는 방문하지 않았으면서 육지인 곳만 호출하여 횟수를 줄이도록 했다
from collections import deque
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
count = 0
col = len(grid[0])
row = len(grid)
visited = [[0 for _ in range(col)] for _ in range(row)]
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
def bfs(y, x):
visited[y][x] = 1
q = deque([[y, x]])
while q:
cur_y, cur_x = q.popleft()
for idx in range(4):
new_y = cur_y + dy[idx]
new_x = cur_x + dx[idx]
if 0 <= new_y < row and 0 <= new_x < col and grid[new_y][new_x] == "1" and visited[new_y][new_x] == 0:
visited[new_y][new_x] = 1
q.append([new_y, new_x])
return 1
for i in range(row):
for j in range(col):
if visited[i][j] == 0 and grid[i][j] == "1":
count += bfs(i, j)
return count
- 맨 아래 코드를 보면 col 값이 먼저 증가하므로 bfs(y값, x값)을 넣어준다
- 이동전략은 for idx in range(4) 를 통해서 4방향으로 이동한다
- 그다음 if 절에서 이동 범위가 맵을 초과하지는 않았는지, 방문한 적은 없는지, 섬이 맞는지 확인한다.
성공!!! 이제 BFS가 많이 익숙해져가고있다. 힘내자~!
감사합니다.
'코딩테스트 > Graph' 카테고리의 다른 글
인접 그래프 최소 이동거리 구하기 (1) | 2024.01.25 |
---|---|
그래프 군집 구하기 (0) | 2024.01.24 |