찬환
천천히 꾸준하게
찬환
전체 방문자
오늘
어제
  • 분류 전체보기 (19)
    • Problem Solving (2)
      • BOJ (2)
    • Algorithm (3)
    • Java (1)
    • CS (7)
      • 컴퓨터구조 (3)
      • 운영체제 (2)
      • 데이터베이스 (2)
    • Web (0)
    • Spring (1)
    • Git (2)
    • 북스터디 (2)
      • 이펙티브 자바 (2)
    • Tech Stack (0)
    • 끄적끄적 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • effective_java
  • 알고리즘
  • 삼성 B형
  • ITEM_2
  • 이펙티브 자바
  • 컴퓨터의_구성요소
  • 브랜치 전략
  • B형 후기
  • 빌더패턴
  • java.util.arrays
  • SpringBoot
  • 프로세스_메모리_구조
  • 운영체제
  • Spring Ecosystem
  • 정적팩터리메서드
  • 이펙티브자바
  • BOJ_2580
  • 폰노이만구조
  • Arrays메서드
  • 컨텍스트_스위칭
  • Boj_14499
  • Key의 종류
  • Arrays정리
  • cs
  • Udacity_git_commit_message_style_guide
  • 삼성SW역량
  • backtracking
  • 주사위굴리기
  • git flow
  • BOJ

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
찬환

천천히 꾸준하게

Algorithm

[알고리즘] 백트래킹 해결 방법과 예시 문제

2023. 2. 21. 09:34
728x90

백트래킹 이란?

백트래킹은 완전탐색을 하는 과정에서 가지치기를 통해 유망하지 않은 곳은 더 이상 탐색하지 않는 알고리즘 기법을 말한다.

 

백트래킹 용어

  • 유망(Promising) 하다.
    • 어떤 노드를 방문했을 때 그 노드를 포함한 경로가 해답이 될 수 있다면 유망하다고 한다.
  • 가지치기 (Pruning)
    • 유망하지 않은 노드가 포함되는 경로는 더 이상 고려하지 않는다.

 

백트래킹 문제의 일반적인 해결 방법

  1. 상태 공간 트리를 구한다.
  2. 깊이 우선 탐색(DFS)을 이용하여 상태 공간 트리를 탐색한다.
  3. 각 노드가 유망한지를 점검한다.
  4. 만일 그 노드가 유망하지 않으면, 그 노드의 부모 노드로 돌아가서 다음 자식 노드로 간다.
  5. 어떤 노드가 해당 문제의 해가 되면 탐색을 중지하고, 해를 구한다.

 

백트래킹 문제의 예시

1. N-Queen 문제 (BOJ 9663)

N-Queen 문제는 대표적인 백트래킹 문제 중 하나이다.

N-Queen 문제란 NxN 크기의 체스판 위에 N개의 퀸을 서로 공격할 수 없도록 배치하는 문제이다. 즉, 같은 행, 열, 대각선에 다른 퀸이 위치하지 않도록 하는 것이다.

위 예시 코드를 실행하면 4x4 크기의 체스판 위에 4개의 퀸을 배치하는 문제를 해결한 결과가 출력된다.

백트래킹을 사용한 N-Queen 문제의 시간 복잡도는 O(N!)이며, 이는 브루트 포스와 동일하다. 하지만 백트래킹은 유망하지 않은 경우를 가지치기하며, 브루트 포스보다 더 효율적으로 문제를 해결할 수 있다.

 

2. 스도쿠 (BOJ 2239)

스도쿠는 일반적인 백트래킹 문제로 유명하다. 스도쿠는 9x9 크기의 정사각형 격자판에 숫자를 채워넣는 게임으로, 각 행과 각 열, 그리고 3x3 크기의 정사각형에 중복되는 숫자가 없어야 한다.

 

3. 암호 만들기 (BOJ 1759)

암호 만들기 문제는 길이가 L인 암호를 만드는 문제로, 암호는 알파벳 소문자로만 이루어져 있으며 최소 한 개의 모음과 최소 두 개의 자음으로 구성되어 있다.

 

4. 순열과 조합

순열과 조합은 백트래킹을 활용한 대표적인 문제 중 하나이다.

 

마치며

백트래킹은 완전탐색을 하는 과정에서 유망하지 않은 경우를 가지치기하는 코드를 통해 시간을 단축시키는 알고리즘이다.

그렇기 때문에 백트래킹을 잘하기 위해서는 순열, 조합을 활용한 완전탐색 문제를 많이 풀수록 더 잘할 수 있다.

또, 백트래킹은 DFS 방식으로 모든 경우를 탐색하기 때문에 재귀함수를 잘 짤 수 있고, 잘 이해할 수 있어야 한다.

아직 재귀로 구현한 순열, 조합에 미숙하다면 순열, 조합을 활용한 브루트포스 문제를 먼저 풀어보고 백트래킹을 하는 것을 추천한다.

728x90
저작자표시 (새창열림)

'Algorithm' 카테고리의 다른 글

[자료구조] 그래프란? 개념과 표현 방법  (0) 2023.02.22
[알고리즘] 그리디 알고리즘의 특징과 그리디 구분법  (0) 2023.02.17
    'Algorithm' 카테고리의 다른 글
    • [자료구조] 그래프란? 개념과 표현 방법
    • [알고리즘] 그리디 알고리즘의 특징과 그리디 구분법
    찬환
    찬환
    공부한 내용을 포스팅하는 IT 기술블로그입니다.

    티스토리툴바