Skip to content

Commit 9374bd8

Browse files
committed
#260 pacific-atlantic-water-flow
1 parent 932fa8e commit 9374bd8

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
"""
2+
풀이 :
3+
빗물이 흘러가서 바다에 도착하는 경우가 아닌 역으로 바다에서 출발해서 도달할 수 있는 경우를 찾는다
4+
4방향 중에 height가 현재 위치보다 높거나 같으면 위로 흘러갈 수 있고 visited set에 저장해서
5+
이미 도달한 곳은 return 으로 처리한다
6+
바다와 위아래로 맞닿은 해안과 좌우로 맞닿은 해안에서 각각 출발하도록 두번의 반복문을 수행
7+
8+
r, c : 행렬의 길이
9+
10+
TC : O(R * C)
11+
visited_set을 통해 pacific, atlantic이 최악의 경우에도 섬 전체를 한번씩 순회하므로
12+
13+
SC : O(R * C)
14+
각 set의 크기와 dfs 호출 스택은 섬 크기에 비례하므로
15+
"""
16+
17+
class Solution:
18+
def pacificAtlantic(self, heights: List[List[int]]) -> List[List[int]]:
19+
paci_visited, atl_visited = set(), set()
20+
n_rows = len(heights)
21+
n_cols = len(heights[0])
22+
23+
def dfs(r: int, c: int, visited: set) -> None:
24+
if (r, c) in visited:
25+
return
26+
visited.add((r, c))
27+
for (m, n) in [(r + 1, c), (r - 1, c), (r, c + 1), (r, c - 1)]:
28+
if 0 <= m < n_rows and 0 <= n < n_cols:
29+
if heights[r][c] <= heights[m][n]:
30+
dfs(m, n, visited)
31+
32+
for r in range(n_rows):
33+
dfs(r, 0, paci_visited)
34+
dfs(r, n_cols - 1, atl_visited)
35+
36+
for c in range(n_cols):
37+
dfs(0, c, paci_visited)
38+
dfs(n_rows - 1, c, atl_visited)
39+
40+
result = []
41+
for both in paci_visited.intersection(atl_visited):
42+
result.append(list(both))
43+
44+
return result

0 commit comments

Comments
 (0)