Skip to content

Commit dc454f5

Browse files
authored
[PS] : Pacific Atlantic Water Flow
1 parent c988e63 commit dc454f5

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/**
2+
* @param {number[][]} heights
3+
* @return {number[][]}
4+
*/
5+
const pacificAtlantic = function (heights) {
6+
// ๊ฐ cell์—์„œ ์‹œ์ž‘ํ•ด์„œ ๋ฐ”๋‹ค๋กœ ๋ป—์–ด๋‚˜๊ฐ€๋Š” ๊ฒƒ ๋ง๊ณ 
7+
// ๋ฐ”๋‹ค์—์„œ ์‹œ์ž‘ํ•ด์„œ ๊ฐ cell์ด ๋ฐ”๋‹ค๋กœ ํ˜๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ ํ›„
8+
// ๋‘ ๋ฐ”๋‹ค์— ๋ชจ๋‘ ํ˜๋Ÿฌ๊ฐˆ ์ˆ˜ ์žˆ๋Š” cell๋งŒ filter
9+
10+
const rows = heights.length;
11+
const cols = heights[0].length;
12+
13+
// ๊ฐ ๋ฐ”๋‹ค์— ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ๋‹ด๋Š” visited๋ฅผ ๋งŒ๋“ฆ
14+
const pacific = Array.from({ length: rows }, () => Array(cols).fill(false));
15+
const atlantic = Array.from({ length: rows }, () => Array(cols).fill(false));
16+
17+
const direction = [[0, 1], [0, -1], [1, 0], [-1, 0]];
18+
19+
// ์ˆœํšŒ
20+
function bfs(r, c, visited) {
21+
visited[r][c] = true;
22+
23+
const queue = [[r, c]];
24+
25+
while (queue.length) {
26+
const [r, c] = queue.shift();
27+
28+
for (const [dr, dc] of direction) {
29+
const nr = r + dr;
30+
const nc = c + dc;
31+
32+
// ๋‚˜๋ณด๋‹ค height๊ฐ€ ํฌ๊ณ , ๋ฐฉ๋ฌธํ•œ ์  ์—†์œผ๋ฉด, ํ์— ๋‹ด๊ธฐ
33+
if (0 <= nr && nr < rows && 0 <= nc && nc < cols
34+
&& !visited[nr][nc]
35+
&& heights[nr][nc] >= heights[r][c]
36+
) {
37+
queue.push([nr, nc]);
38+
visited[nr][nc] = true;
39+
}
40+
}
41+
}
42+
}
43+
44+
// ๋ฐ”๋‹ค์—์„œ ์‹œ์ž‘ํ•ด์„œ ๊ฑฐ๊พธ๋กœ ํƒ์ƒ‰
45+
for (let r = 0; r < rows; r++) {
46+
bfs(r, 0, pacific); // left
47+
bfs(r, cols - 1, atlantic); // right
48+
}
49+
50+
for (let c = 0; c < cols; c++) {
51+
bfs(0, c, pacific); // top
52+
bfs(rows - 1, c, atlantic); // bottom
53+
}
54+
55+
// ํƒœํ‰์–‘, ๋Œ€์„œ์–‘์œผ๋กœ ๋ชจ๋‘ flowํ•  ์ˆ˜ ์žˆ๋Š” cell ์ฐพ๊ธฐ
56+
const result = [];
57+
58+
for (let r = 0; r < rows; r++) {
59+
for (let c = 0; c < cols; c++) {
60+
if (pacific[r][c] && atlantic[r][c]) {
61+
result.push([r, c]);
62+
}
63+
}
64+
}
65+
66+
return result;
67+
};
68+
69+
// ์‹œ๊ฐ„๋ณต์žก๋„: O(m*n)
70+
// ๊ณต๊ฐ„๋ณต์žก๋„: O(m*n)

0 commit comments

Comments
ย (0)