티스토리 뷰
반응형
목표
이건 공부해도 모르겠더라
BackTracking
백트래킹 알고리즘
이 모든 경우의 수 brute force
와 비슷해서 이해를 못하는 듯 하다.
누가 정리한 백D브
차이
백트래킹 vs DFS
백트래킹
은 이미 지나쳐온 곳을 다시 돌아가서 다른 가능성을 시도해보는 걸 반복하는 기법으로, 반드시 DFS만으로 가능하지 않고 BFS등으로도 가능한 기법이다.- 즉, 정리를 하자면 백트레킹은
하나의 문제 해결 방법론
이고 이러한 백트레킹을 구현하는 방법론 중 하나가 DFS이다.
백트래킹 vs 브루트포스
브루트 포스
는 모든 경우의 수를 탐색하는 문제 해결 방법론이다.- 이와 달리, 백트래킹은 단계마다 조건을 충족하는지 검사하여 조건을 충족하는 경우에만 계속해서 탐색한다.
- 즉, 정리를 하자면 브루트포스 모든 가지를 탐색하는 방법론이고 백트레킹을 조건을 보고 가지치기를 해나가면서 탐색하는 방법론이다.
문제로 풀어보자
N-Queen
import java.io.*;
public class Main {
static int n;
static int[] map;
static int count=0;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
for(int i=1; i<n+1; i++) {
map = new int[n+1];
map[1] = i; // (1,i)에 queen
dfs(2);
}
System.out.println(count);
}
static void dfs(int depth) {
if(depth > n) {
count++;
}
else {
for(int i=1; i<n+1; i++) {
map[depth] = i; // (depth,i)에 queen
if(check(depth)) {
dfs(depth+1);
}
// 없어도 됨. 이미 map[depth] = i에서 부모 퀸의 위치가 초기화 되었기 때문이다.
// map[depth] = 0;
}
}
}
static boolean check(int depth) {
for(int i=1; i<depth; i++) {
// 열이 같으면 false
if(map[i] == map[depth]) return false;
// 00 01 02 03
// 10 11 12 13
// 20 21 22 23
// 30 31 32 33
// (/\) 양방향 대각선
if(Math.abs(i-depth) == Math.abs(map[i]-map[depth])) return false;
}
return true;
}
}
모르겠다. 🤔🤔🤔
조금더 대표적인 문제를 살펴보자
Letter Combinations of a Phone Number
LeetCode에 존재하는 백트래킹문제이다.
숫자를 입력하여 조합할 수 있는 모든 경우의 문장을 확인하는 문제이다.
많은 풀이 방법이 있지만 재귀를 사용한 DFS 풀이방식을 많이 사용한다.
class Solution {
HashMap<Integer,String> map;
private void solve(int i,String s,String digits,List<String> list){
if(i==digits.length()){
list.add(s);
return;
}
int digit=(digits.charAt(i))-'0';
String values=map.get(digit);
for(int j=0;j<values.length();j++){
solve(i+1,s+values.charAt(j),digits,list);
}
}
public List<String> letterCombinations(String digits) {
if(digits.length()==0) return new ArrayList<String>();
map=new HashMap<>();
map.put(2,"abc");
map.put(3,"def");
map.put(4,"ghi");
map.put(5,"jkl");
map.put(6,"mno");
map.put(7,"pqrs");
map.put(8,"tuv");
map.put(9,"wxyz");
List<String> list=new ArrayList<>();
solve(0,"",digits,list);
return list;
}
}
관련 포스팅 (LeetCode)
반응형
'알고리즘' 카테고리의 다른 글
[LeetCode] 15. 3SUM - 파이썬 (0) | 2022.03.16 |
---|---|
Palindrome 문제 접근 (0) | 2022.03.07 |
최대 부분 합 구하기 - Kadane's_Algorithm (0) | 2022.03.02 |
최소신장트리 알고리즘 (0) | 2022.02.26 |
Leven Shtein Algorithm (0) | 2022.02.26 |
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- ajax
- 알고리즘
- C언어
- spring-cloud
- 프로그래머스
- docker
- security
- CS
- 수학
- 디자인패턴
- Matlab
- 자격증
- 릿코드
- 스프링
- interview
- 그래프
- Algorithm
- OOP
- java
- 면접
- 스프링부트
- nginx
- JPA
- springboot
- kakao
- 백준
- Solid
- Spring
- 매트랩
- 자바
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함