Brute-force
완전탐색 알고리즘
: 모든 경우의 수를 다 체크해 답을 찾는 방법
Brute Force
: 반복/조건문을 통해 가능한 모든 방법을 찾는 경우
순열(Permutation)
: 임의의 수열이 있을 때, 그것을 다른 순서로 연산하는 방법
👇아래는 자바로 순열을 구하는 코드
import java.io.*;
public class Main{
static int[] perm;
static int n = 4;
public static void main(String[] args) throws IOException{
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
perm = new int[]{1, 2, 3, 4};
while(get_next_perm()){
for(int num : perm){
bw.write(String.valueOf(num) + " ");
}
bw.write("\n");
}
bw.flush();
}
private static boolean get_next_perm(){
int i = n-1;
// 뒤에서부터 체크하여 현재 위치가 뒤에서부터 오름차순이 아닌 경우를 찾음
// 뒤에서부터 오름차순이라는 것은 사전 순으로 최종 수열이라는 의미임
while(i > 0 && perm[i-1] >= perm[i]) i--;
// 이미 자체적으로 최종 순열이라면, false를 반환
if(i <= 0) return false;
// j는 현재 i-1위치에서 시작.
// i-1 이후의 모든 숫자 중 큰 것을 고르는데 그 중, j의 값이 가장 큰 경우로 선택
int j = i-1;
while(j < n-1 && perm[j+1] > perm[i-1]) j++;
// j와 i-1번째의 숫자를 swap
swap(i-1, j);
// i번째부터 이후의 모든 숫자를 뒤집음
// i~n-1 사이의 숫자를 상호 뒤집어야 하므로 j 값을 n-1로 초기화
j = n-1;
while(i < j){
swap(i, j);
i+=1; j-=1;
}
return true;
}
private static void swap(int i, int j){
int temp = perm[i];
perm[i] = perm[j];
perm[j] = temp;
}
}
재귀
: 자기 자신을 호출하여 반복문 생성
public class Main{
static int lim = 100; // 1~100까지의 제한
static int n = 5; // 5개만 고른다.
public static void main(String[] args){
int[] chosen = new int[n]; // 선택된 숫자가 저장되는 배열
// 시작은 0부터 시작하며 0개를 현재 선택했으니 아래와 같이 parameter 전달!
solve(chosen, 0, 0);
}
// chosen은 선택된 숫자가 저장된 배열
// curr은 현재 숫자를 선택하는 index
// cnt는 몇 개의 숫자가 선택되었는지 확인
private static void solve(int[] chosen, int curr, int cnt){
// n개의 숫자를 다 선택했다면 출력 후 더 이상 재귀를 돌지 않아야 한다!
// 탈출 조건의 정의!
if(cnt == n){
for(int i : chosen){
System.out.print(i + " ");
}
System.out.println();
return;
}
// 반복문을 통해 숫자를 계속 선택!
for(int i=curr+1; i <= lim; i++){
// 현재 선택된 숫자를 저장
chosen[cnt] = i;
// 다음 숫자를 선택하기 위해 재귀 호출
solve(chosen, curr, cnt+1);
}
}
}
BFS, DFS
: 너비 우선 탐색과 깊이 우선 탐색. 그래프 자료구조에서 모든 정점을 탐색하기 위한 방법