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

: 너비 우선 탐색과 깊이 우선 탐색. 그래프 자료구조에서 모든 정점을 탐색하기 위한 방법