(Leetcode) [Graph] Pacific Atlantic water flow
Question
m x n
์ง์ฌ๊ฐํ์ ์ฌ์ด ์๋๋ฐ, ์ข์ธก๊ณผ ์๋จ์ ํํ์์ผ๋ก ๋๋ฌ์ธ์ฌ์ ธ์๊ณ ์ฐ์ธก๊ณผ ํ๋จ์ ๋์์์ผ๋ก ๋๋ฌ์ธ์ฌ์ ธ์๋ค.
์ฌ์ ์ ์ฌ๊ฐํ์ ์
๋ก ๋๋์ด์ง๋ค. heights
๋ผ๋ ์ ์ ๋งคํธ๋ฆญ์ค์์ heights[r][c]
์ ์ ํ์๋ ์ ์๋ (r, c)
์ขํ์ ํด๋ฐ๊ณ ๋๋ฅผ ๋ํ๋ธ๋ค.
์ฌ์๋ ๋น๊ฐ ๋ง์ด ์ค๋๋ฐ, ๊ธฐ์ค ์
์ ๋์๋จ๋ถ์ ์๋ ์
๋ค์ ๋์ด๊ฐ ๊ธฐ์ค ์
์ ๋์ด๋ณด๋ค ๋ฎ์ผ๋ฉด ๋น๊ฐ ํ๋ฌ ๋ด๋ ค๊ฐ๋ค. ๊ทธ๋ฆฌ๊ณ ๋์์ ์ ํด์๋ ์
๋ค์์๋ ๋น๊ฐ ๋ฌด์กฐ๊ฑด ๋์์ผ๋ก ํ๋ฌ ๋ด๋ ค๊ฐ๋ค.
์ฐ๋ฆฌ์ ๋ชฉํ๋ ๋น๋ฌผ์ด ํํ์๊ณผ ๋์์ ๋ ๊ตฐ๋ฐ ๋ค๋ก ํ๋ฌ๊ฐ ์ ์๋ ์
์ ์ขํ๋ฅผ result๋ผ๋ ๋ฒกํฐ์ pushํ๋ ๊ฒ์ด๋ค.
My first approach
ํจ์ ๋ ๊ฐ๋ฅผ ๋ง๋ค์๋ค. ๊ฐ ์
์ด Pacific Ocean์ผ๋ก ๊ฐ ์ ์๋์ง๋ฅผ ํ์ธํ๋ bool dfsPacific๊ณผ, Atlantic Ocean์ผ๋ก ๊ฐ ์ ์๋์ง๋ฅผ ํ์ธํ๋ bool dfsAtlantic. base case๋ค์ row์ column์ ์ขํ๋ฅผ ์ด์ฉํด์ ๋ฌผ์ด Pacific์ด๋ Atlantic์ ๋๋ฌํ๋์ง๋ฅผ ํ์ธํด์ return trueํ๊ณ , ๊ทธ๋ฆฌ๊ณ Pacific ๊ฐ์ ๊ฒฝ์ฐ๋ ์ข&์ ๋ฐฉํฅ, Atlantic ๊ฐ์ ๊ฒฝ์ฐ๋ ์ฐ&ํ ๋ฐฉํฅ์ ์
์ซ์์ ๋น๊ตํด์ ๋ฌผ์ด ์ด๋ํ ์ ์์ผ๋ฉด return false ํ๊ฒ๋ ์ค๊ณ๋ฅผ ํด๋จ๋ค.
์ฌ์ค ํจ์ ์ด๋ฆ๋ค์ dfs๋ฅผ ๋ฃ๊ธด ํ์ง๋ง ๋ด๊ฐ ์์ฑํ ์ฝ๋๊ฐ dfs๊ฐ๋
์ ์ ์ฌ์ฉํ๊ฑฐ ๊ฐ์ง๋ ์๋ค.
๋ฌธ์ ์
์ผ๋จ ์ฝ๋๋ ๋์๊ฐ๋ค. ํ์ง๋ง ๊ฒฝ์ฐ์ ๋ฐ๋ผ์ ์๋ฅผ ๋ค์ด ๋ฌผ์ ๋ฐฉํฅ์ด ๊ณ์ ํ ๋ฐฉํฅ์ผ๋ก๋ง ๊ฐ๋ฉด ๋๋ฌํ์ง ๋ชป ํ ์๋ ์์ง๋ง ์ํ์ข์ฐ๋ฅผ ์๋ค๊ฐ๋คํ๋ฉฐ ์์ง์ด๋ฉด ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ด๋ฐ ๋ฌธ์ ์ ์ ํด๊ฒฐ๋ฐฉ๋ฒ์ด dfs๊ฐ ๋ ๊ฑฐ ๊ฐ์ง๋ง ๊ฐํผ๋ฅผ ๋ชป ์ก๊ฒ ๋ค.
Solution
์ด๊น์์ด geeksforgeeks์์ ํด์ค์ ์ฝ์ด๋ดค๋ค.
DFS๋ BFS ๋ ๋ค ์ฌ์ฉํ ์ ์๋ค๊ณ ํ๋ค. ํ์ง๋ง ํด์ค์์ BFS์ ๋ํ ํ์ด๊ฐ ์์ด์ ์ฐธ๊ณ ํด์ ์ด๋ค.
์ผ๋จ ๋ด๊ฐ ์๊ฐํ๋ ์ผ๋จ Pacific๊ณผ Atlantic์ ๋ฐ๋ก ๋ณด๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํ๋ค.
- Create two queues; each for storing the coordinates directly connected to the Pacific Ocean and the Atlantic Ocean.
- Create two vectors for each marking the visited coordinates during the BFS traversal from all the coordinates in two queues.
- Coordinates that are marked as visited in both the vectors are added in the result.
vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
vector<vector<int>> result;
queue<pair<int, int>> qPac, qAtl;
int row = heights.size();
int col = heights[0].size();
for (int i=0; i<col; i++) {
qPac.push({0, i});
qAtl.push({row-1, i});
}
for (int j=0; j<row-1; j++) {
qPac.push({j+1, 0});
qAtl.push({j, col-1});
}
vector<vector<bool>> visitedP(row, vector<bool>(col, false));
vector<vector<bool>> visitedA(row, vector<bool>(col, false));
BFS(heights, visitedP, qPac, row, col);
BFS(heights, visitedA, qAtl, row, col);
for (int i=0; i<row; i++) {
for (int j=0; j<col; j++) {
if (visitedP[i][j] && visitedA[i][j]) {
result.push_back({i, j});
}
}
}
return result;
}
// function to check if coordinate (i, j) lies inside N*M matrix
bool safe(int i, int j, int row, int col) {
if (i<0 || j<0 || i>=row || j>=col)
return false;
return true;
}
// perform BFS traversal and mark visited cells
void BFS(vector<vector<int>> heights, vector<vector<bool>> &visited, queue<pair<int, int>> q, int row, int col) {
while (!q.empty()) {
pair<int, int> cur = q.front();
q.pop();
visited[cur.first][cur.second] = true;
// check right side of the cell and see if right cell can reach the current cell
if (safe(cur.first+1, cur.second, row, col) && heights[cur.first+1][cur.second] >= heights[cur.first][cur.second]
&& visited[cur.first+1][cur.second]==false) {
q.push({cur.first+1, cur.second});
visited[cur.first+1][cur.second] = true;
}
// check left ...
if (safe(cur.first-1, cur.second, row, col) && heights[cur.first-1][cur.second] >= heights[cur.first][cur.second]
&& visited[cur.first-1][cur.second]==false) {
q.push({cur.first-1, cur.second});
visited[cur.first-1][cur.second] = true;
}
// check down ...
if (safe(cur.first, cur.second-1, row, col) && heights[cur.first][cur.second-1] >= heights[cur.first][cur.second]
&& visited[cur.first][cur.second-1]==false) {
q.push({cur.first, cur.second-1});
visited[cur.first][cur.second-1] = true;
}
// check up ...
if (safe(cur.first, cur.second+1, row, col) && heights[cur.first][cur.second+1] >= heights[cur.first][cur.second]
&& visited[cur.first][cur.second+1]==false) {
q.push({cur.first, cur.second+1});
visited[cur.first][cur.second+1] = true;
}
}
}
Leave a comment