C++/코드트리 챌린지

[코드트리 챌린지] 2주차 DFS - DFS / 두 방향 탈출 가능 여부 판별하기

tmd1 2023. 9. 16. 20:54

https://www.codetree.ai/missions/2/problems/determine-escapableness-with-2-ways/description

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

 

코드:

#include <bits/stdc++.h>
using namespace std;

int n, m;
int arr[105][105]; 
int visited[105][105]; // 방문 판단
int dx[2] = { 1,0 }; // 아래, 우측 순 탐색
int dy[2] = { 0,1 };

// 배열 범위 내 인지 판단
bool InRange(int nx, int ny) {
    return (0 <= nx && nx < n && 0 <= ny && ny < m);
}

// 갈 수 있는지 판단
bool Cango(int nx, int ny) {
    if (!InRange(nx, ny)) return false;
    // 뱀이 존재하는 경우
    if (arr[nx][ny] == 0) return false;
    if (visited[nx][ny]) return false;

    return true;
}

void DFS(int x, int y) {
    // 아래 우측 순으로 탐색함
    for (int i = 0; i < 2; i++) {
        int nx = x + dx[i];
        int ny = y + dy[i];

        // 갈 수 있는 경우 true, dfs
        if (Cango(nx, ny)) {
            visited[nx][ny] = true;
            DFS(nx, ny);
        }
    }
}

int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> arr[i][j];
        }
    }

    visited[0][0] = true;
    // (0,0)에서 dfs 시작
    DFS(0, 0);

    // 끝에 도달할 수 있는지 판단
    if (visited[n - 1][m - 1])
        cout << 1;
    else
        cout << 0;

}
(0,0)에서 DFS를 시작하도록 합니다.

dx,dy 배열을 통해 아래, 우측 순으로 탐색을 진행하도록 합니다.

Cango()함수를 통해 배열 내 존재, 뱀이 존재하지 않음, 방문한 적 없음 위 세가지를 만족할 경우
visited[nx][ny]를 true로 만들고 갈 수 있는 방향을 통해 DFS를 재귀적으로 진행합니다.

모든 DFS를 진행한 이후 visited[n-1][m-1] 즉 우측 하단을 방문했는지 확인하면 탈출구가 있음을
판단할 수 있으므로 그에따라 출력을 달리하도록 합니다.