📌 LeetCode [733]: Flood Fill
🔗 문제 링크
문제 설명 📄
2D 배열 image
가 주어지며, 배열의 픽셀 중 (sr, sc)
의 위치에서 시작하여 해당 픽셀과 동일한 색상을 가진 모든 연결된 영역을 새 색상 color
로 변경해야 합니다.
문제 접근 방식 📋
- 시작 픽셀 확인:
- 주어진
(sr, sc)
픽셀의 색상(before
)을 저장하고, 이를color
로 변경해야 합니다. - 만약 시작 픽셀의 색상이 이미
color
라면 작업이 필요 없으므로 그대로 반환합니다.
- 주어진
- BFS 방식:
- 큐(
deque
)를 사용하여 시작 픽셀부터 상하좌우로 확장하며 동일한 색상을 가진 모든 픽셀을 탐색합니다. - 방문한 픽셀은 즉시
color
로 변경하여 중복 탐색을 방지합니다.
- 큐(
Solution 💻
from collections import deque
class Solution:
def floodFill(self, image: List[List[int]], sr: int, sc: int, color: int) -> List[List[int]]:
q = deque()
if image[sr][sc] != color:
q.append((sr, sc))
before = image[sr][sc]
while q:
x, y = q.popleft()
image[x][y] = color
for px, py in [[0, 1], [0, -1], [1, 0], [-1, 0]]:
dx, dy = x + px, y + py
if 0 <= dx < len(image) and 0 <= dy < len(image[0]):
if image[dx][dy] == before:
q.append((dx, dy))
return image
시간 복잡도 분석 ⏲️
- BFS 탐색: (O(m × n))
- 이미지의 크기(픽셀 수)가 (m \times n)일 때, 모든 픽셀을 한 번씩 방문.
- 총 시간 복잡도: (O(m × n)).
공간 복잡도 분석 🗄️
- 큐 공간: (O(m × n))
- 최악의 경우 모든 픽셀이 큐에 들어갈 수 있음.
- 총 공간 복잡도: (O(m × n)).
리팩토링 🛠️
개선된 코드
class Solution:
def floodFill(self, image: List[List[int]], sr: int, sc: int, color: int) -> List[List[int]]:
def dfs(x, y):
if not (0 <= x < len(image) and 0 <= y < len(image[0])) or image[x][y] != before:
return
image[x][y] = color
for px, py in [[0, 1], [0, -1], [1, 0], [-1, 0]]:
dfs(x + px, y + py)
before = image[sr][sc]
if before != color:
dfs(sr, sc)
return image
리팩토링 후 시간 복잡도 ⏲️
- DFS 탐색: (O(m × n))
- 모든 픽셀을 한 번씩 방문.
- 총 시간 복잡도: (O(m × n)).
리팩토링 후 공간 복잡도 🗄️
- 재귀 호출 스택: (O(m × n))
- 최악의 경우 재귀 호출이 모든 픽셀을 방문.
- 총 공간 복잡도: (O(m × n)).
'알고리즘' 카테고리의 다른 글
LeetCode [383]: Ransom Note (0) | 2024.12.20 |
---|---|
LeetCode [2303]: Calculate Amount Paid in Taxes (0) | 2024.12.20 |
LeetCode [1791]: Find Center of Star Graph (0) | 2024.12.20 |
LeetCode [168]: Excel Sheet Column Title (1) | 2024.12.20 |
LeetCode [228]: Summary Ranges (0) | 2024.12.20 |