기술블로그/알고리즘

[알고리즘] 브루트포스란?

kittae 2024. 12. 5. 19:58

브루트포스란?

Brute: 무식한

Force: 힘 

 

  • 쉽게 설명하자면 무식한 힘을 갖는 알고리즘을 뜻한다. 
  • 완전탐색으로 답을 찾는 알고리즘이며, 해당 알고리즘은 반복문조건문을 사용한다!

어떻게 동작하는가?

  • 가장 유명한 문제로는 자물쇠 문제가 있다.
  • 모든 수를 탐색하여 자물쇠를 푸는 비효율적이면서도 100% 정확도를 자랑하는 브루트포스의 대표적인 문제이다.
// 실제 비밀번호 (예: 1234)
int actualPassword = 1234;

// 4중 for문을 사용하여 모든 4자리 비밀번호를 탐색
for (int i = 0; i <= 9; i++) {
	for (int j = 0; j <= 9; j++) {
    	for (int k = 0; k <= 9; k++) {
        	for (int l = 0; l <= 9; l++) {
            	// 현재 시도 중인 비밀번호 생성
                int attempt = i * 1000 + j * 100 + k * 10 + l;

               	// 비밀번호가 맞는지 확인
                if (attempt == actualPassword) {
                	System.out.println("맞춘 비밀번호: " + attempt);
                    return; // 비밀번호를 찾았으므로 종료
                }
            }
        }
    }
}

 

시간 복잡도는?

  • 단일 루프: O(n)
  • 중첩 루프: O(n^2)
  • 3중 루프 이상: O(n^k) (k는 중첩된 반복문의 수)
  • 이므로 경우의 수가 많아질 수록 비효율적이다.

공간 복잡도는?

  • 별도의 메모리 사용하지 않거나, 최소한의 메모리만 사용한다
  • O(1) or O(n)

장단점은?

  • 모든 경우의 수를 탐색하기 때문에 100%라는 정답률을 가지지만,
  • 반대로 모든 경우의 수를 탐색하기 때문에 그만큼 높은 시간 복잡도를 필요로 한다.

마무리하며..

  • 브루트포스를 이용한 백준 문제 [2798 - 블랙잭]을 풀며 글을 마치겠다.

 

[최종 코드]

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        ArrayList<Integer> arr = new ArrayList<>();

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        st = new StringTokenizer(br.readLine(), " ");
        for (int i = 0; i < n; i++) {

            arr.add(Integer.parseInt(st.nextToken()));
        }

        int max = 0;

        for (int i = 0; i < n; i++) {
            for (int j = i+1; j < n; j++) {
                for (int k = j+1; k < n; k++) {

                    int sum = (arr.get(i) + arr.get(j) + arr.get(k));

                    if (sum <= m && max <= sum)
                        max = sum;
                }
            }
        }

        System.out.println(max);
    }
}

'기술블로그 > 알고리즘' 카테고리의 다른 글

[알고리즘] 에라토스 테네스의 체란?  (0) 2024.12.04