From cedcafe60135dc5a8e860c5e55b62af04dc9d5d5 Mon Sep 17 00:00:00 2001 From: spiritstone <36044398+spiritstone@users.noreply.github.com> Date: Mon, 15 Nov 2021 19:20:20 +0900 Subject: [PATCH] =?UTF-8?q?Revert=20"[DFS&BFS]=2010=EC=9B=94=2015=EC=9D=BC?= =?UTF-8?q?=20-update"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../1520_re.cpp" | 59 ------------- .../kakao_socialDistance_re.cpp" | 84 ------------------- 2 files changed, 143 deletions(-) delete mode 100644 "10\354\233\224 12\354\235\274 - DFS & BFS/1520_re.cpp" delete mode 100644 "10\354\233\224 12\354\235\274 - DFS & BFS/kakao_socialDistance_re.cpp" diff --git "a/10\354\233\224 12\354\235\274 - DFS & BFS/1520_re.cpp" "b/10\354\233\224 12\354\235\274 - DFS & BFS/1520_re.cpp" deleted file mode 100644 index a902ab4..0000000 --- "a/10\354\233\224 12\354\235\274 - DFS & BFS/1520_re.cpp" +++ /dev/null @@ -1,59 +0,0 @@ -// -// Created by user on 2021-11-02. -// - -#include -#include - -using namespace std; - -//상, 하, 좌, 우 -int dr[4] = {-1, 1, 0, 0}; // 상 하 (row) -int dc[4] = {0, 0, -1, 1}; // 좌 우 (col) - -vector> board, dp; -int n, m; // n: 세로, m: 가로 - -int dfs(int cr, int cc) { - if (cr == n - 1 && cc == m - 1) //오른쪽 아래 끝까지 왔다면 경로가 하나 생긴 것이므로 dp값 1로 초기화 후 리턴 - return dp[cr][cc] = 1; - if (dp[cr][cc] != -1) //이미 값(현재 정점에서 오른쪽 아래 끝까지 가는 경로의 수)이 존재한다면 - return dp[cr][cc]; // 해당 값 리턴 - - dp[cr][cc] = 0; //탐색 시작을 위해 0으로 초기화 - for (int i = 0; i < 4; i++) { // 상하좌우 방향 탐색 - int nr = cr + dr[i]; // 상 하로 이동하며 row 좌표 리셋 - int nc = cc + dc[i]; // 좌 우로 이동하며 col 좌표 리셋 - //보드의 범위 안에 있고, 현재 정점의 값보다 작을 경우 - if (nr >= 0 && nr < n && nc >= 0 && nc < m && board[cr][cc] > board[nr][nc]) - dp[cr][cc] += dfs(nr, nc); //다음 정점의 값을 현재 정점에 더함(현재 정점에서 다음 정점 가는게 가능하므로) - } - - return dp[cr][cc]; //자식 노드를 모두 탐색했다면 현재 정점의 값을 리턴해서 부모 노드로 돌아감 -} - -/** - * [DFS + DP활용 문제] - * dfs만 활용하면 시간초과 - * 따라서 경로의 경우의 수를 저장하며 탐색해야 함 - * - * [BFS가 안되는 이유] - * 주변 노드부터 탐색하다 갈 수 있는 경로에 이미 방문 처리가 되어 탐색 못할 수 있음 - * 주변 노드부터 탐색하므로 여러 경우의 수를 한 번에 탐색해서, 도착지점을 찍기 전이기 때문에 dp 활용이 불가 - */ - -int main() { - //입력 - cin >> n >> m; // - board.assign(n, vector(m, 0)); // 세로 m. 가로 n의 크기를 가진 벡터 생성 - dp.assign(n, vector(m, -1)); //이미 탐색한 값이 0일 수도 있기 때문에 구분하기 위해 -1로 초기화 - for (int i = 0; i < n; i++) // 반복문 돌면서 - for (int j = 0; j < m; j++) - cin >> board[i][j]; // 각 지점의 높이 입력받기 - - //연산 & 출력 - cout << dfs(0, 0); - - return 0; - -} \ No newline at end of file diff --git "a/10\354\233\224 12\354\235\274 - DFS & BFS/kakao_socialDistance_re.cpp" "b/10\354\233\224 12\354\235\274 - DFS & BFS/kakao_socialDistance_re.cpp" deleted file mode 100644 index c80e41f..0000000 --- "a/10\354\233\224 12\354\235\274 - DFS & BFS/kakao_socialDistance_re.cpp" +++ /dev/null @@ -1,84 +0,0 @@ -// -// Created by user on 2021-11-02. -// - -#include -#include -#include -#include - -using namespace std; -const int SIZE = 5; - -//특정 응시자에 대해 거리두기가 지켜지는지 확인 -bool bfs(vector &place, int row, int col) { - //상, 하, 좌, 우 - int dr[4] = {-1, 1, 0, 0}; // 상 하 (row) - int dc[4] = {0, 0, -1, 1}; // 좌 우 (col) - - vector> dist(SIZE, vector(SIZE, 0)); //방문 여부, 각 정점까지의 맨허튼 거리 - queue> q; - - dist[row][col] = 1; //초기값이 0이기 때문에 1로 초기화 - q.push(make_pair(row, col)); // row, col값 큐에 추가 - - while (!q.empty()) { // 큐에 원소가 있는동안 반복 - int cr = q.front().first; // row값은 큐의 첫번째 원소의 첫번째 값 - int cc = q.front().second; // col: 큐의 첫번째 원소의 두번째 값 - q.pop(); // row와 col값 저장했으니 큐에서 빼준다. - - if (dist[cr][cc] == 3) //맨허튼 거리 2이하까지만 탐색 - continue; - - for (int i = 0; i < 4; i++) { // 상하좌우 방향 탐색 - int nr = cr + dr[i]; // 상 하로 이동하며 row 좌표 재설정 - int nc = cc + dc[i]; // 좌 우로 이동하며 col 좌표 재설정 - - //범위를 벗어나거나, 방문했거나, 파티션이 있음 - if (nr < 0 || nr >= SIZE || nc < 0 || nc >= SIZE || dist[nr][nc] || place[nr][nc] == 'X') - continue; - if (place[nr][nc] == 'P') //응시자가 있으면 거리두기 지키지 못함 - return false; - dist[nr][nc] = dist[cr][cc] + 1; // 맨해튼 거리 추가 - q.push(make_pair(nr, nc)); // 값 추가 - } - } - return true; //거리두기 지킴 -} - -//특정 대기실에 대해 거리두기가 지켜지는지 확인 -bool socialDistance(vector &place) { - for (int i = 0; i < SIZE; i++) { // 5X5 크기 대기실에 있는 응시자에 대해 - for (int j = 0; j < SIZE; j++) { - //응시자가 있다면, 거리두기 확인 - if (place[i][j] == 'P' && !bfs(place, i, j)) - return false; // 응시자 있는데 거리두기 안 지켰으면 false 반환 - } - } - return true; // 나머지는 true -} - -vector solution(vector> places) { - vector answer; // 정답 저장할 벡터 - for (int i = 0; i < SIZE; i++) // 대기실 5개에 대해 - answer.push_back(socialDistance(places[i])); // 각 대기실에 대해 거리두기 지켜졌는지 여부 추가하고 - return answer; // answer 반환 -} - -/** - * 맨허튼 거리가 2이하 == BFS 또는 DFS 했을 때의 거리가 2이하 - * - * 각 대기실의 모든 응시자에 대해 거리두기를 지키고 있는지 확인 - * 5x5 크기의 대기실 5개이기 때문에 모든 응시자에 대해 bfs 또는 dfs를 수행해도 시간 초과 발생하지 않음 - */ -int main() { - // places 원소의 길이: 5, P: 응시자, O: 빈 테이블, X: 파티션 - vector> places = {{"POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"}, - {"POOPX", "OXPXP", "PXXXO", "OXXXO", "OOOPP"}, - {"PXOPX", "OXOXP", "OXPOX", "OXXOP", "PXPOX"}, - {"OOOXX", "XOOOX", "OOOXX", "OXOOX", "OOOOO"}, - {"PXPXP", "XPXPX", "PXPXP", "XPXPX", "PXPXP"}}; // 각 행은 하나의 대기실 구조 - vector ans = solution(places); // 대기실당 거리두기 지키는지 여부 저장할 벡터 - for (int i = 0; i < SIZE; i++) - cout << ans[i] << ' '; // 각 대기실당 거리두기를 잘 지켰다면 1, 못 지켰다면 0 -} \ No newline at end of file