Post

[필독!!] -> DFS, 백트랙킹, 조합, 순열

이번 글에서는 DFS, 백트랙킹, 조합, 순열의 차이에 대해 간단하게 설명합니다

📊 DFS, 백트랙킹, 조합, 순열

유형시간 복잡도안전한 N의 한계선핵심 특징
1차원 단방향 DFS$O(2^N)$$N \le 20 \sim 25$오직 오른쪽으로만 전진 (싸이클 없음). 방문 해제가 필요 없음.
2차원 상하좌우 DFS$O(4^{row \times col})$ (최악)$row,col \le 4 \sim 5$상하좌우 모든 경로를 탐색하며 방문 배열을 원상복구함.
조합 (Combination)$O(2^N)$ 또는 $O(\binom{N}{R})$$N \le 20$순서를 고려하지 않음. start 인덱스로 뒤쪽만 탐색.
순열 (Permutation)$O(N!)$$N \le 10 \sim 11$순서를 고려함. 항상 처음부터 검사하며 visited 사용.



잠깐!! 여기서 2차원 상하좌우 DFS의 경우

row, col == 5 일때

$4^{25}$ 라고 생각하여 무조건 시간초과 아니냐라고 궁금해 할 수 있지만

visited, 목표점 도달시 조기종료를 통해 대략 실제 연산량은 다음과 같다고 한다.

$1.5 \times 10^{25}$




1. 1차원 단방향 DFS

1
2
3
4
5
6
7
8
static void dfs1D(int idx, int currentSum){
    if(idx==N){
        if(currentSum==target) found=true;
        return;
    }
    dfs1D(idx+1,currentSum+arr[idx]);
    dfs1D(idx+1,currentSum);
}

2. 2차원 상하좌우 DFS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
static void dfs2D(int r,int c,boolean[][] visited){
    if(r==targetR&&c==targetC){
        pathCount++;
        return;
    }
    for(int d=0;d<4;d++){
        int nr=r+dr[d], nc=c+dc[d];
        if(nr>=0&&nr<row&&nc>=0&&nc<col&&!visited[nr][nc]){
            visited[nr][nc]=true;
            dfs2D(nr,nc,visited);
            visited[nr][nc]=false;
        }
    }
}

3. 조합

1
2
3
4
5
6
static void combination(int start,int depth){
    if(depth==R) return;
    for(int i=start;i<N;i++){
        combination(i+1,depth+1);
    }
}

4. 순열

1
2
3
4
5
6
7
8
9
10
static void permutation(int depth,boolean[] visited){
    if(depth==R) return;
    for(int i=0;i<N;i++){
        if(!visited[i]){
            visited[i]=true;
            permutation(depth+1,visited);
            visited[i]=false;
        }
    }
}
This post is licensed under CC BY 4.0 by the author.

Trending Tags