[24.05.29] 99클럽 코테 스터디 10일차 TIL - 완전 탐색 알고리즘

2024. 5. 29. 23:45·회고
728x90

1. 완전 탐색 알고리즘

가능한 모든 경우의 수를 체크해서 정답을 찾는방법으로, Brute Force라고 부르기도 한다. 이 방법은 다음과 같은 절차를 따른다.

  1. 모든 가능한 경우의 수 생성 : 문제의 가능한 모든 상태를 생성한다.
  2. 각 경우의 수 평가 : 각 경우의 수에 대해 문제를 해결
  3. 최적해 선택 : 평가한 결과 중 최적의 해를 선택

완전 탐색에 사용되는 주요 기법에는 아래와 같은 방법 등이 있다.

  1. Brute Force 기법 : 반복, 조건문을 활용해 모두 테스트
  2. 순열 : n개의 원소 중 r개의 원소를 순서를 고려한 모든 조합을 생성
  3. 조합 : 순서를 고려하지 않고 가능한 모든 조합 생성
  4. 부분집한 생성 : 집합의 모든 부분집합을 생성
  5. 재귀 

1.1 Brute Force 기법

반복문과 조건문을 통해 가능한 모든 방법을 단순히 찾는 경우를 의미한다. 

 

1.2 순열(Permutation)

순열은 주어진 요소들의 순서를 바꿔가며 가능한 모든 경우를 생성하는 방법이다.

사용 예

  • 문자열이나 배열의 요소들을 재배열하는 문제
  • 최단 경로 문제
import itertools

arr = [1, 2, 3]
permutations = list(itertools.permutations(arr))
print(permutations)

# [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]

 

1.3 조합 생성(Combinations)

조합은 주어진 요소들 중에서 순서를 고려하지 않고 선택하는 방법이다. n개의 요소 중 k개를 선택하는 경우 nCk만큼의 조합이 생긴다.

사용 예

  • 부분 집합 문제
  • 선택 문제 (ex. 팀 구성)
import itertools

arr = [1, 2, 3]
combinations = list(itertools.combinations(arr, 2))
print(combinations)

# [(1, 2), (1, 3), (2, 3)]

 

1.4 부분 집합 생성 (Subsets)

부분 집합 생성은 주어진 집합의 모든 부분 집합을 생성하는 방법이다. n개의 요소가 주어졌을 때, 총 2^n개의 부분집합이 존재한다.

# 비트마스크를 활용한 예제
def generate_subsets(arr):
    n = len(arr)
    subsets = []
    
    for i in range(1 << n):  # 1<<n은 2의 n제곱을 의미 
        subset = []
        for j in range(n): # 각 요소의 포함 여부를 결정하기 위해 마스크의 각 비트 확인
            if i & (1 << j): # 비트연산으로 mask의 i번째 비트가 1인지 확인
                subset.append(arr[j])
        subsets.append(subset)
    
    return subsets

arr = [1, 2, 3]
subsets = generate_subsets(arr)
print(subsets)

# [[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]

 

1.5 재귀

재귀는 자기 자신을 호출하는 함수를 활용하여 코드를 짧게 줄이는 방법이다. 

재귀를 구현하기 위해선 아래의 조건들을 고려해야한다.

  • 재귀를 탈출하기 위한 탈출 조건
    무한 루프, 배열 범위 초과 오류 등을 방지하기 위한 탈출문이 필요하다.
  • 상태변화 
    재귀 호출 시 입력 값 또는 상태가 변경되어 재귀를 탈출 할 수 있게 되어야 한다.
# 피보나치 수열 예제
def fibonacci(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n-1) + fibonacci(n-2) # 재귀적으로 함수를 호출

 

728x90

'회고' 카테고리의 다른 글

[24.05.31] 99클럽 코테 스터디 12일차 TIL - DefaultDict  (0) 2024.05.31
[24.05.30] 99클럽 코테 스터디 11일차 TIL - 회전 알고리즘, 튜플 자료형  (0) 2024.05.30
[24.05.28] 99클럽 코테 스터디 9일차 TIL - 해시 알고리즘, Set 자료형  (0) 2024.05.28
[24.05.27] 99클럽 코테 스터디 8일차 TIL - Iterable, Iterator  (0) 2024.05.28
[24.05.26] 99클럽 코테 스터디 7일차 TIL - Permutation(순열), Combinations(조합)  (0) 2024.05.27
'회고' 카테고리의 다른 글
  • [24.05.31] 99클럽 코테 스터디 12일차 TIL - DefaultDict
  • [24.05.30] 99클럽 코테 스터디 11일차 TIL - 회전 알고리즘, 튜플 자료형
  • [24.05.28] 99클럽 코테 스터디 9일차 TIL - 해시 알고리즘, Set 자료형
  • [24.05.27] 99클럽 코테 스터디 8일차 TIL - Iterable, Iterator
bbooo
bbooo
  • bbooo
    bbooo
    bbooo
  • 전체
    오늘
    어제
    • 분류 전체보기 (142)
      • study (61)
        • 백준(BOJ) (34)
        • Programmers (15)
        • LeetCode (9)
      • AI (4)
        • Paper (0)
      • SSAC X IFFEL (4)
        • DeepML (1)
        • 밑바닥 부터 시작하는 딥러닝 (2)
      • 회고 (46)
      • Error (10)
      • Setting (15)
  • 블로그 메뉴

    • 홈
    • 태그
    • 글쓰기
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    99클럽
    파이썬 석유시추
    파이썬
    코딩테스트 준비
    vscode
    programmers 석유시추
    풀이 실패
    LeetCode
    python 석유시추
    두 포인터
    개발자 취업
    programmers 과제 진행하기
    set
    문자열을 원하는 길이로
    프로그래머스 석유시추
    백트래킹
    브루트포스
    sequence item 0: expected str instance int found
    Counter
    투포인터
    python 과제 진행하기
    typeerror: sequence item 0: expected str instance int found
    백준
    그리디 알고리즘
    항해99
    Til
    docker
    sort
    파이썬 과제 진행하기
    백준 2470
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
bbooo
[24.05.29] 99클럽 코테 스터디 10일차 TIL - 완전 탐색 알고리즘
상단으로

티스토리툴바