옴클
학습문제집문제제출이력게시판그룹휴식리더보드

© 2026 옴클. All rights reserved.

이용약관개인정보처리방침

    파이썬 알고리즘 골드

    문제집 104문제
    1. 1백트래킹
    2. 누적합
    3. 분할 정복
    4. 이분탐색
    5. 동적 계획법 (DP)
    6. LIS (DP & 이분탐색)
    7. LCS (최장 공통 부분 수열)
    8. 냅색 알고리즘
    9. 다익스트라
    10. 벨만-포드
    11. 플로이드 와샬
    12. 투 포인터
    13. MITM (Meet In The Middle)
    14. 유니온파인드
    15. MST — 크루스칼
    16. MST — 프림
    17. CCW와 신발끈 공식
    18. 비트마스크
    19. 위상 정렬
    20. 그래프와 탐색 2
    21. 동적 계획법 2 (DP)
    22. 트리 2 (고급)
    23. 트리와 동적 계획법

    직접 해보세요

    python
    1. 학습
    2. /
    3. 파이썬 알고리즘 골드
    4. /
    5. 백트래킹

    백트래킹

    레슨 1 · 파이썬 알고리즘 골드

    백트래킹 (Backtracking)

    백트래킹은 해를 찾는 도중 막히면 이전 단계로 돌아가 다른 경로를 탐색하는 알고리즘이에요. DFS 기반으로 구현하며, 불필요한 탐색을 **가지치기(Pruning)**로 줄입니다.


    핵심 원리

    text
    탐색 시작
      ├─ 선택 1 → 조건 만족 → 다음 탐색
      │           조건 불만족 → 가지치기 (prune)
      ├─ 선택 2 → ...
      └─ ...
    

    기본 구조

    python
    s = []  # 현재 선택 스택
    
    def backtrack(start):
        if len(s) == M:          # 종료 조건 (M개를 선택했을 때)
            print(' '.join(map(str, s)))
            return
    
        for i in range(start, N + 1):
            # 가지치기 조건
            if 조건을_만족하지_않으면:
                continue
    
            s.append(i)          # 선택 (push)
            backtrack(i + 1)     # 다음 단계 탐색
            s.pop()              # 선택 취소 (pop, 백트래킹)

    예시 — 수 조합 (N과 M)

    1~N 중에서 M개를 중복 없이 오름차순으로 선택

    python
    import sys
    input = sys.stdin.readline
    sys.setrecursionlimit(10**5)
    
    N, M = map(int, input().split())
    s = []
    
    def backtrack(start):
        if len(s) == M:
            print(' '.join(map(str, s)))
            return
        for i in range(start, N + 1):
            s.append(i)
            backtrack(i + 1)
            s.pop()
    
    backtrack(1)

    예시 — N-Queens

    8×8 체스판에 퀸 N개를 서로 공격하지 않도록 배치

    python
    N = int(input())
    col = [0] * N   # col[i] = i행에 놓인 퀸의 열 번호
    count = 0
    
    def is_valid(row):
        for r in range(row):
            if col[r] == col[row]:        # 같은 열
                return False
            if abs(col[r] - col[row]) == abs(r - row):  # 대각선
                return False
        return True
    
    def backtrack(row):
        global count
        if row == N:
            count += 1
            return
        for c in range(N):
            col[row] = c
            if is_valid(row):
                backtrack(row + 1)
    
    backtrack(0)
    print(count)

    정리

    • 백트래킹: DFS + 가지치기
    • 상태를 스택(리스트)에 push/pop하며 탐색
    • 조건 미충족 시 즉시 가지치기로 불필요한 탐색 제거

    직접 해보세요

    python