study/알고리즘

[알고특] backtracking

SHplusR 2023. 7. 26. 23:23

대학생 알고리즘 특강을 들으며 백트래킹이라는 구현방법을 처음 알게되었다.

백트래킹은 나무위키에서 아래와같이 설명한다.

 

모든 경우의 수를 전부 고려하는 알고리즘. 상태공간을 트리로 나타낼 수 있을 때 적합한 방식이다. 일종의 트리 탐색 알고리즘이라고 봐도 된다. 방식에 따라서 깊이우선탐색(Depth First Search, DFS)과 너비우선탐색(Breadth First Search, BFS), 최선 우선 탐색(Best First Search/Heuristic Search)이 있다. 

이 백트래킹을 사용한 대표적인 문제는 스도쿠이다.

https://www.acmicpc.net/problem/2580

 

2580번: 스도쿠

스도쿠는 18세기 스위스 수학자가 만든 '라틴 사각형'이랑 퍼즐에서 유래한 것으로 현재 많은 인기를 누리고 있다. 이 게임은 아래 그림과 같이 가로, 세로 각각 9개씩 총 81개의 작은 칸으로 이루

www.acmicpc.net

 

이 문제에서 한번은 런타임에러...2번은 틀렸다고 나왔다.

런타임에러는 class 이름을 Main이 아니라 Solution으로 해서 에러가 났었는데, 

2번 틀린게...처음에 왜 틀렸는지 이해가 안 갔다. 

그러다가 백트래킹을 알게되었고 해당 코드를 추가하며 해결되었다.

        //만약 0(값 비어있음)일 경우
        if(maps[r][c] == 0){
            for(int i =1; i<=9; i++){
                if(possible(r,c,i)){
                    maps[r][c] = i;
                    sdoku(r,c+1);
                }
            }
            maps[r][c] = 0;
            return;
        }
        sdoku(r,c+1);
    }

1. 어떻게 풀것인지

2. 시간복잡도

3. 공간복잡도

4. 핵심부분