Skip to content

Commit 57d73ba

Browse files
committed
add: solve #260 Pacific Atlantic Water Flow with ts
1 parent f8653b2 commit 57d73ba

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
/**
2+
* 깊이 μš°μ„  탐색(DFS)을 μ‚¬μš©ν•˜μ—¬ νŠΉμ • λ°”λ‹€μ—μ„œ 올라갈 수 μžˆλŠ” μ’Œν‘œμ„ μ €μž₯
3+
* @param i ν˜„μž¬ μœ„μΉ˜μ˜ ν–‰ (row)
4+
* @param j ν˜„μž¬ μœ„μΉ˜μ˜ μ—΄ (column)
5+
* @param visited λ°©λ¬Έν•œ μ’Œν‘œλ₯Ό μ €μž₯ν•˜λŠ” Set (λ°”λ‹€μ—μ„œ 도달할 수 μžˆλŠ” μœ„μΉ˜λ₯Ό μ €μž₯)
6+
* @param heights 높이 정보가 λ‹΄κΈ΄ 2차원 λ°°μ—΄
7+
*
8+
* μ‹œκ°„ λ³΅μž‘λ„: O(m Γ— n)
9+
* - 각 셀은 μ΅œλŒ€ ν•œ 번 λ°©λ¬Έν•˜λ©°, 총 m Γ— n개의 셀을 탐색함
10+
*
11+
* 곡간 λ³΅μž‘λ„: O(m Γ— n)
12+
* - `visited` Set에 μ΅œλŒ€ m Γ— n개의 μ’Œν‘œλ₯Ό μ €μž₯ κ°€λŠ₯
13+
* - μž¬κ·€ 호좜 μŠ€νƒμ˜ κΉŠμ΄λŠ” O(m + n) (μ΅œμ•…μ˜ 경우 κ°€μž₯ κΈ΄ 경둜λ₯Ό 따라 탐색)
14+
*/
15+
function dfs(i: number, j: number, visited: Set<string>, heights: number[][]) {
16+
if (visited.has(`${i},${j}`)) return;
17+
18+
visited.add(`${i},${j}`);
19+
20+
for (const [di, dj] of [[-1, 0], [1, 0], [0, -1], [0, 1]]) {
21+
const newI = i + di;
22+
const newJ = j + dj;
23+
24+
if (
25+
newI >= 0 && newI < heights.length &&
26+
newJ >= 0 && newJ < heights[0].length &&
27+
heights[newI][newJ] >= heights[i][j]
28+
) {
29+
dfs(newI, newJ, visited, heights);
30+
}
31+
}
32+
};
33+
34+
/**
35+
* 두 λ°”λ‹€ λͺ¨λ‘ 도달할 수 μžˆλŠ” μ’Œν‘œλ₯Ό μ°ΎλŠ” ν•¨μˆ˜
36+
*
37+
* @param heights 2차원 λ°°μ—΄λ‘œ 이루어진 μ§€ν˜•μ˜ 높이 정보
38+
* @returns 두 λ°”λ‹€ λͺ¨λ‘ 도달할 수 μžˆλŠ” μ’Œν‘œ λ°°μ—΄
39+
*
40+
* μ‹œκ°„ λ³΅μž‘λ„: O(m Γ— n)
41+
* - νƒœν‰μ–‘ 및 λŒ€μ„œμ–‘μ—μ„œ 각각 DFS μˆ˜ν–‰ β†’ O(m Γ— n)
42+
* - κ²°κ³Όλ₯Ό μ°ΎλŠ” 이쀑 루프 β†’ O(m Γ— n)
43+
*
44+
* 곡간 λ³΅μž‘λ„: O(m Γ— n)
45+
* - `pacificSet`κ³Ό `atlanticSet`에 μ΅œλŒ€ O(m Γ— n)개의 μ’Œν‘œ μ €μž₯
46+
*
47+
*/
48+
function pacificAtlantic(heights: number[][]): number[][] {
49+
if (!heights || heights.length === 0 || heights[0].length === 0) return [];
50+
51+
const rows = heights.length;
52+
const cols = heights[0].length;
53+
54+
const pacificSet = new Set<string>();
55+
const atlanticSet = new Set<string>();
56+
57+
// νƒœν‰μ–‘(μ™Όμͺ½, μœ„μͺ½)μ—μ„œ μΆœλ°œν•˜λŠ” DFS
58+
for (let i = 0; i < rows; i++) dfs(i, 0, pacificSet, heights);
59+
for (let j = 0; j < cols; j++) dfs(0, j, pacificSet, heights);
60+
61+
// λŒ€μ„œμ–‘(였λ₯Έμͺ½, μ•„λž˜μͺ½)μ—μ„œ μΆœλ°œν•˜λŠ” DFS
62+
for (let i = 0; i < rows; i++) dfs(i, cols - 1, atlanticSet, heights);
63+
for (let j = 0; j < cols; j++) dfs(rows - 1, j, atlanticSet, heights);
64+
65+
const result: number[][] = [];
66+
for (let i = 0; i < rows; i++) {
67+
for (let j = 0; j < cols; j++) {
68+
if (pacificSet.has(`${i},${j}`) && atlanticSet.has(`${i},${j}`)) {
69+
result.push([i, j]);
70+
}
71+
}
72+
}
73+
74+
return result;
75+
};
76+

0 commit comments

Comments
Β (0)