백트래킹 정리

Posted by : on

Category : PS


백트래킹 문제 유형 및 코드 기본형

백트래킹(Backtracking)은 해결책에 대한 후보를 구축해 나가다가, 해당 후보가 해결책이 될 수 없음을 발견하는 즉시 이를 포기(백트랙)하고, 다른 후보를 찾아 해결책으로의 가능성을 시도하는 알고리즘이다.

주로 결정 트리(decision tree)의 깊이 우선 탐색(DFS)으로 구현되며 퍼즐, 최적화 문제 등에서 자주 사용된다.

백트래킹 문제 유형 예시

  • 순열: 주어진 숫자나 문자열의 모든 가능한 순서를 찾는 문제.
  • 조합: 주어진 숫자나 문자열 중에서 일부를 선택하여 만들 수 있는 모든 조합을 찾는 문제.
  • N-Queens: N×N 체스판 위에 N개의 퀸을 서로 공격할 수 없는 위치에 배치하는 문제.
  • 부분 집합: 주어진 집합의 모든 부분 집합을 찾는 문제.
  • 수도쿠: 빈 칸에 숫자를 채워 넣어서 각 행, 각 열, 그리고 9개의 3x3 서브그리드가 모두 1부터 9까지의 숫자를 포함하도록 하는 퍼즐 문제.
  • 단어 검색: 주어진 단어를 2D 문자 배열에서 찾는 문제.

코드 기본형

def backtrack(경로, 선택지):
    # 종료 조건
    if 만족하는 조건:
        결과에 경로 추가
        return
    
    # 선택지 탐색
    for 선택 in 선택지:
        # 선택 실행
        경로에 선택 추가
        선택지에서 선택 제거
        
        # 다음 후보 탐색
        backtrack(경로, 선택지)
        
        # 선택 되돌리기
        경로에서 선택 제거
        선택지에 선택 다시 추가

예시 : 순열 구하기

def permute(nums):
    def backtrack(path):
        if len(path) == len(nums):
            result.append(path[:])  # 깊은 복사
            return
        
        for n in nums:
            if n in path:
                continue  # 이미 선택된 숫자는 스킵
            path.append(n)
            backtrack(path)
            path.pop()  # 백트래킹

    result = []
    backtrack([])
    return result

  • nums: 숫자 리스트
  • result: 모든 가능한 순열 저장

About Sejun Jeong
Sejun Jeong

Seize the day with programming

Email : usopked16496@gmail.com

Website : https://usopked.github.io

About UPKED

2024년
2025년

Star
Categories
Useful Links