Summary | Brute-Force Algorithm

Table of Contents

[ Algorithm ] 완전탐색 Brute-Force

μ½”λ”© ν…ŒμŠ€νŠΈλ₯Ό μ€€λΉ„ν•˜λ©΄μ„œ 보닀 νƒ„νƒ„ν•œ 기초λ₯Ό μœ„ν•΄ κ³΅λΆ€ν•œ μ•Œκ³ λ¦¬μ¦˜μ„ ν•˜λ‚˜μ”© μ •λ¦¬ν•΄λ³΄κ³ μž ν•œλ‹€.

λ³Έ ν¬μŠ€νŠΈλŠ” 완전탐색에 λŒ€ν•΄ μ •λ¦¬ν•œ λ‚΄μš©μ΄λ‹€.

완전탐색은 μ˜μ–΄λ‘œ Brute-Force / Exhaustive search 라고 ν•˜κ³ , 말 κ·ΈλŒ€λ‘œ λͺ¨λ“  경우의 수λ₯Ό μ‹œλ„ν•˜λŠ” 방법이닀. 완전탐색은 λ‹€μŒκ³Ό 같은 κ²½μš°μ— 자주 쓰인닀.

  • κ΅¬ν˜„μ΄ κ°„λ‹¨ν•˜κ³ , ν•΄κ°€ μ‘΄μž¬ν•˜λ©΄ 항상 찾음
  • πŸ”₯ μž…λ ₯ κ°’μ˜ λ²”μœ„κ°€ μž‘μ€ 경우

λͺ¨λ“  경우의 수λ₯Ό 돌기 λ•Œλ¬Έμ— 그만큼 경우의 μˆ˜κ°€ λ§Žμ•„μ§€λ©΄ μ‹œκ°„μ„ 많이 μ†Œμš”ν•œλ‹€λŠ” 단점이 있기 λ•Œλ¬Έμ— μ£Όμ˜ν•΄μ•Ό ν•œλ‹€. 이에 ν•΄λ‹Ήν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ BFS, DFS, λΉ„νŠΈλ§ˆμŠ€ν¬μ— λŒ€ν•΄ μ •λ¦¬ν•˜μ˜€λ‹€.

완전탐색 : BFS

λ„ˆλΉ„ μš°μ„  탐색 BFS, Breadth-First Search μ΄λž€ 루트 λ…Έλ“œμ—μ„œ μ‹œμž‘ν•΄ μΈμ ‘ν•œ λ…Έλ“œλ₯Ό λ¨Όμ € νƒμƒ‰ν•˜λŠ” 방법을 λ§ν•œλ‹€. λ’€μ—μ„œ DFS ν•  λ•Œλ„ λ‚˜μ˜€κ² μ§€λ§Œ, 이 두 μ•Œκ³ λ¦¬μ¦˜μ€ 특히 βœ… μ–΄λ–€ λ…Έλ“œλ₯Ό λ°©λ¬Έν–ˆλŠ”μ§€ κΈ°μ–΅ν•΄μ•Ό ν•œλ‹€. 이 뢀뢄이 빠진닀면 λ¬΄ν•œλ£¨ν”„μ— 빠질 μœ„ν—˜μ΄ μžˆλ‹€.

좜처 : A quick explanation of DFS & BFS (Depth First Search & Breadth-First Search)

BFS 같은 κ²½μš°λŠ” λ°©λ¬Έν•œ λ…Έλ“œλ₯Ό μ°¨λ‘€λ‘œ in-out ν•  수 μžˆμ–΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— FIFO First-In First-Out 큐λ₯Ό μ‚¬μš©ν•œλ‹€. ν•΄λ‹Ή μ•Œκ³ λ¦¬μ¦˜μ€ 두 λ…Έλ“œ μ‚¬μ΄μ˜ μ΅œλ‹¨ 경둜λ₯Ό μ°Ύκ±°λ‚˜ μž„μ˜μ˜ 경둜λ₯Ό 찾을 λ•Œ 효과적으둜 쓰인닀.

κ°„λ‹¨ν•œ 예λ₯Ό λ“€μ–΄ 이λ₯Ό 파이썬으둜 κ΅¬ν˜„ν•΄λ³΄μž.

[문제] Xλ‘œλΆ€ν„° μΆœλ°œν•˜μ—¬ 도달할 수 μžˆλŠ” λ„μ‹œ μ€‘μ—μ„œ, μ΅œλ‹¨ 거리가 K인 λͺ¨λ“  λ„μ‹œμ˜ 번호λ₯Ό ν•œ 쀄에 ν•˜λ‚˜μ”© μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 좜λ ₯해라. 이 λ•Œ 도달할 수 μžˆλŠ” λ„μ‹œ μ€‘μ—μ„œ, μ΅œλ‹¨ 거리가 K인 λ„μ‹œκ°€ ν•˜λ‚˜λ„ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ -1을 좜λ ₯ν•œλ‹€.

[BOJ] 18352. νŠΉμ • 거리의 λ„μ‹œ μ°ΎκΈ°

import sys
from collections import deque

def bfs(graph, start, route):
  queue = deque(start)
  while queue:
    now = queue.popleft()
    for node in graph[now]:
      # if not visited
      if route[node] == -1:
        route[node] + route[now] + 1
        queue.append(node)
  return

city, road, distance, start = map(int, sys.stdin.readline().split())

route = [-1] * (city + 1)
route[start] = 0

graph = [[] for _ in range(city+1)]

# directed graph
for _ in range(road):
  a, b = map(int, sys.stdin.readline().split())
  graph[a].append(b)

bfs(graph, start, route)

# if answer distance K exist
if route.count(distance):
  for i in range(1, city+1):
    if route[i] == distance:
      print(i)
else:
  print(-1)


완전탐색 : DFS

깊이 μš°μ„  탐색 DFS, Depth-First Search μ΄λž€ 루트 λ…Έλ“œμ—μ„œ μ‹œμž‘ν•΄μ„œ λ‹€μŒ 브랜치둜 λ„˜μ–΄κ°€κΈ° 전에 ν•΄λ‹Ή 브랜치λ₯Ό λκΉŒμ§€ νƒμƒ‰ν•˜κ³  λ„˜μ–΄κ°€λŠ” 방법을 λ§ν•œλ‹€.

좜처 : A quick explanation of DFS & BFS (Depth First Search & Breadth-First Search)

DFSλŠ” μž¬κ·€λ‘œ κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜λ©°, BFS와 λ§ˆμ°¬κ°€μ§€λ‘œ βœ… μ–΄λ–€ λ…Έλ“œλ₯Ό λ°©λ¬Έν–ˆλŠ”μ§€ μ²΄ν¬ν•΄μ€˜μ•Ό ν•œλ‹€. BFS보닀 κ΅¬ν˜„μ΄ κ°„λ‹¨ν•˜λ‹€λŠ” μž₯점이 μžˆμ§€λ§Œ, λ‹¨μˆœ 검색 μ†λ„λŠ” μƒλŒ€μ μœΌλ‘œ λŠλ¦¬λ‹€λŠ” 단점을 가지고 μžˆλ‹€. DFSλŠ” λͺ¨λ“  λ…Έλ“œλ₯Ό λ°©λ¬Έν•  λ•Œ 주둜 μ‚¬μš©ν•œλ‹€.

μ΄λ²ˆμ—λ„ κ°„λ‹¨ν•œ 예λ₯Ό λ“€μ–΄ 파이썬으둜 κ΅¬ν˜„ν•΄λ³΄κ² λ‹€.

[문제] 숫자 Nκ³Ό numberκ°€ μ£Όμ–΄μ§ˆ λ•Œ, Nκ³Ό μ‚¬μΉ™μ—°μ‚°λ§Œ μ‚¬μš©ν•΄μ„œ ν‘œν˜„ ν•  수 μžˆλŠ” 방법 쀑 N μ‚¬μš©νšŸμˆ˜μ˜ μ΅œμ†Ÿκ°’μ„ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜μ„Έμš”. (1<= N <=9, 1<= number <=32000)

[μ˜ˆμ‹œ] N = 5, number = 12
12 = 5 + 5 + (5 / 5) + (5 / 5)
12 = 55 / 5 + 5 / 5
12 = (55 + 5) / 5

➑️ answer = 4

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] N으둜 ν‘œν˜„

def solution (N, number):
  answer = 0

  # set : 쀑볡 처리, in 탐색 유리
  calc = [set() for i in range(9)]

  # N < 8
  for i in range(1, 9):
    # possible number
    # small << big
    calc[i].add(int(str(N)*i))

    for j in range(i//2 + 1):
      # first, second for calculation (first < second)
      for first in calc[j]:
        for second in calc[i-j]:
          calc[j].add(first + second)
          calc[j].add(first - second)
          calc[j].add(second - first)
          calc[j].add(first * second)

          if first != 0:
            calc[j].add(second / first)
          if second != 0:
            calc[j].add(first / second)
    
    # find the minimum Ns
    if number in calc[j]:
      return i

  # μ΅œμ†Ÿκ°’ > 8 : -1 λ°˜ν™˜
  return -1


완전탐색 : λΉ„νŠΈλ§ˆμŠ€ν¬

Q. μ™œ λΉ„νŠΈλ§ˆμŠ€ν¬λ₯Ό μ‚¬μš©ν• κΉŒ?

  • DP, μˆœμ—΄, λ°°μ—΄ ν™œμš©λ§ŒμœΌλ‘œ ν•΄κ²°ν•  수 μ—†λŠ” 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄
  • 적은 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰
  • λΉ λ₯Έ μˆ˜ν–‰μ‹œκ°„
  • 집합을 λ°°μ—΄μ˜ 인덱슀둜 ν‘œν˜„ν•  수 있음

μ„€λͺ…λ§ŒμœΌλ‘œλŠ” 감이 잘 μ˜€μ§€ μ•ŠμœΌλ‹ˆ, μ•„λž˜ 문제λ₯Ό λΉ„νŠΈλ§ˆμŠ€ν¬λ‘œ μ ‘κ·Όν•΄λ³΄μž.

[문제] λΉ„μ–΄μžˆλŠ” 곡집합 Sκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, μ•„λž˜ 연산을 μˆ˜ν–‰ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. (1 ≀ x ≀ 20)
* add x: S에 xλ₯Ό μΆ”κ°€ν•œλ‹€. S에 xκ°€ 이미 μžˆλŠ” κ²½μš°μ—λŠ” 연산을 λ¬΄μ‹œν•œλ‹€.
* remove x: Sμ—μ„œ xλ₯Ό μ œκ±°ν•œλ‹€. S에 xκ°€ μ—†λŠ” κ²½μš°μ—λŠ” 연산을 λ¬΄μ‹œν•œλ‹€.
* check x: S에 xκ°€ 있으면 1을, μ—†μœΌλ©΄ 0을 좜λ ₯ν•œλ‹€.
* toggle x: S에 xκ°€ 있으면 xλ₯Ό μ œκ±°ν•˜κ³ , μ—†μœΌλ©΄ xλ₯Ό μΆ”κ°€ν•œλ‹€.
* all: Sλ₯Ό {1, 2, ..., 20} 으둜 λ°”κΎΌλ‹€.
* empty: Sλ₯Ό κ³΅μ§‘ν•©μœΌλ‘œ λ°”κΎΌλ‹€.

[BOJ] 11723. 집합

import sys

m = int(sys.stdin.readline())
s = 0b0 

for _ in range(m):
  order = sys.stdin.readline()
  try:
    command, num = order.split()
    num = int(num)

    if com == 'add':
      s = s | (0b1 << num)
    elif com == 'remove':
      s = s & ~(0b1 << num)
    elif com == 'check':
      
 

Related Posts



πŸ’™ You need to log in to GitHub to write comments. πŸ’™
If you can't see comments, please refresh page(F5).