Skip to content

Commit 4e1a262

Browse files
committed
Pacific Atlantic Water Flow Solution
1 parent aeb4708 commit 4e1a262

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
/**
2+
* ๊ทธ๋ž˜ํ”„ ์—ญ๋ฐฉํ–ฅ ํƒ์ƒ‰ : DFS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒœํ‰์–‘๊ณผ ๋Œ€์„œ์–‘์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ง€์ ์„ ์ฐพ๋Š” ๋ฌธ์ œ
3+
* ์‹œ๊ฐ„ ๋ณต์žก๋„: O(m ร— n) - ๊ฐ ์…€์„ ์ตœ๋Œ€ 2๋ฒˆ ๋ฐฉ๋ฌธ
4+
* ๊ณต๊ฐ„ ๋ณต์žก๋„: O(m ร— n) - visited ๋ฐฐ์—ด๊ณผ ์Šคํƒ ๊ณต๊ฐ„
5+
*/
6+
/**
7+
* @param {number[][]} heights
8+
* @return {number[][]}
9+
*/
10+
var pacificAtlantic = function (heights) {
11+
if (!heights || heights.length === 0) return [];
12+
13+
const m = heights.length;
14+
const n = heights[0].length;
15+
16+
// ๋น„ํŠธ๋งˆ์Šคํ‚น ์‚ฌ์šฉํ•œ ๋ฐฉ๋ฌธ ์ƒํƒœ ๊ด€๋ฆฌ
17+
// 0: ๋ฏธ๋ฐฉ๋ฌธ, 1: ํƒœํ‰์–‘๋งŒ, 2: ๋Œ€์„œ์–‘๋งŒ, 3: ๋‘˜ ๋‹ค
18+
const visited = Array(m)
19+
.fill()
20+
.map(() => Array(n).fill(0));
21+
const directions = [
22+
[-1, 0],
23+
[1, 0],
24+
[0, -1],
25+
[0, 1],
26+
];
27+
const result = [];
28+
29+
// DFS - ์Šคํƒ ์‚ฌ์šฉ
30+
function dfs(startPoints, oceanMask) {
31+
const stack = [...startPoints];
32+
33+
while (stack.length > 0) {
34+
const [row, col] = stack.pop();
35+
36+
// ์ด๋ฏธ ํ•ด๋‹น ๋ฐ”๋‹ค๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ์œผ๋ฉด ๊ฑด๋„ˆ๋›ฐ๊ธฐ
37+
if (visited[row][col] & oceanMask) continue;
38+
39+
// ํ˜„์žฌ ๋ฐ”๋‹ค ํ‘œ์‹œ
40+
visited[row][col] |= oceanMask;
41+
42+
// ์–‘์ชฝ ๋ฐ”๋‹ค ๋ชจ๋‘ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•˜๋ฉด ๊ฒฐ๊ณผ์— ์ถ”๊ฐ€
43+
if (visited[row][col] === 3) {
44+
result.push([row, col]);
45+
}
46+
47+
// 4๋ฐฉํ–ฅ ํƒ์ƒ‰
48+
for (const [dr, dc] of directions) {
49+
const newRow = row + dr;
50+
const newCol = col + dc;
51+
52+
// ๊ฒฝ๊ณ„ ํ™•์ธ ๋ฐ ๋†’์ด ์กฐ๊ฑด ํ™•์ธ
53+
if (
54+
newRow >= 0 &&
55+
newRow < m &&
56+
newCol >= 0 &&
57+
newCol < n &&
58+
heights[newRow][newCol] >= heights[row][col] &&
59+
!(visited[newRow][newCol] & oceanMask)
60+
) {
61+
stack.push([newRow, newCol]);
62+
}
63+
}
64+
}
65+
}
66+
67+
// ํƒœํ‰์–‘ ์‹œ์ž‘์ ๋“ค
68+
const pacificStarts = [];
69+
for (let i = 0; i < m; i++) pacificStarts.push([i, 0]); // ์ฒซ ๋ฒˆ์งธ ์—ด
70+
for (let j = 1; j < n; j++) pacificStarts.push([0, j]); // ์ฒซ ๋ฒˆ์งธ ํ–‰ (์ค‘๋ณต ์ œ๊ฑฐ)
71+
72+
// ๋Œ€์„œ์–‘ ์‹œ์ž‘์ ๋“ค
73+
const atlanticStarts = [];
74+
for (let i = 0; i < m; i++) atlanticStarts.push([i, n - 1]); // ๋งˆ์ง€๋ง‰ ์—ด
75+
for (let j = 0; j < n - 1; j++) atlanticStarts.push([m - 1, j]); // ๋งˆ์ง€๋ง‰ ํ–‰ (์ค‘๋ณต ์ œ๊ฑฐ)
76+
77+
// ๊ฐ ๋ฐ”๋‹ค์—์„œ DFS ์‹คํ–‰
78+
dfs(pacificStarts, 1); // ํƒœํ‰์–‘: ๋น„ํŠธ 1
79+
dfs(atlanticStarts, 2); // ๋Œ€์„œ์–‘: ๋น„ํŠธ 2
80+
81+
return result;
82+
};

0 commit comments

Comments
ย (0)